`

Android Service 通知Activity更新界面的方法研究|Service通过Broadcast更新UI

 
阅读更多
Android的最重要的组件式service和activity,那么在使用的过程中,我们最常遇到的问题是他们之间的通信问题。当然今天我们不研究底层的实现问题,我从上层的应用的如何使用的角度进行研究。

首先Activity调用Service

这个是比较基础的,它有两种常见的方法;

第一, 通过Intent,这个比较简单了,可以指定package name和class name的方式来调用,Intent.setClassName这个成员即可。通过putString来装载数据,startService(intent)即可例子如下:

Intent regIntent = new Intent(“com.service”);

regIntent.putExtra(“data”, "helloData");

startService(regIntent);

第二, 通过IPC,这个比较麻烦,一般用不着,这里不谈

但是,反过来,Service如何将一些状态告诉Activity呢?方法有两种

第一、 service 通过广播的形式发送broadcast,我们写一个broadcastReceiver即可,通常的情况,将broadcastReceiver写成Activity的内部类,这个onReceiver可以直接调用activity的方法来更新界面。但是内部类只能采用代码注册的方法registerReceiver(),不能再AndroidManifest.xml文件中进行静态的声明,因为内部类要依赖于外部类而存在的。如果你一定要用AndroidManifest来注册receiver,那么只能把broadcastReceiver写成单独的文件的public类。这时候,你想更新界面就比较麻烦了,你只能自己把你要更新的activity运行起来,然后再向这个activity的内部类发广播的消息来更新界面

第二、 service直接向activity发intent。在service里面进行startActivity是属于在Activity外startActivity即在task外启动activity,因此,必须在intent加入一个参数如下:Intent intentSend = new Intent(Constants.ACTION_STATUS);

intent1.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

intent1.putExtra(“statues“,“end“);

context.startActivity(intent1);

但是此时会引发的一个问题是,多次startActivity会导致很多的activity实现被运行,这肯定不是我们要的,我只要一个Activity就可,此时,我们要在androidManifest里面对这个activity的launchMode设置为singleInstance

<activity android:name="com.demo.Activity"

android:label="@string/online" android:launchMode="singleInstance">

记住啦,有人设置为singleTask,也可以,但他们有一点区别。

同时记住要更新intent,这样getInstent才可以得到每次的新实例

@Override

protected void onNewIntent (Intent intent){

setIntent(intent);

}

--------------------------------------------

在用Service下载文件时,一个问题就是Service没有界面,如何通知用户当前下载的进度,Service直接向Activity传数据有点麻烦,于是eoe想到了用Broadcast,Service广播,Activity负责接收,再对接收到的数据进行处理,就达到了我们的目的。
  先注册Receiver,然后开始Service,上面的TextView和ProgressBar就会随着Service传过来的值变,解除注册Receiver或者结束Service后不会再变。
  
  Service代码:

package com.services;



import android.app.Service;

import android.content.Intent;

import android.os.IBinder;

import android.util.Log;



public class TestService extends Service {

boolean isStop=false;

@Override

public IBinder onBind(Intent intent) {

// TODO Auto-generated method stub

Log.i("TAG","绑定");

return null;

}

public void onCreate(){

Log.i("TAG","Services onCreate");

super.onCreate();

}

public void onStart(Intent intent,int startId){

Log.i("TAG","Services onStart");

super.onStart(intent, startId);

new Thread(){//新建线程,每隔1秒发送一次广播,同时把i放进intent传出

public void run(){

int i=0;

while(!isStop){

Intent intent=new Intent();

intent.putExtra("i", i);

i++;

intent.setAction("android.intent.action.test");//action与接收器相同

sendBroadcast(intent);

Log.i("TAG",String.valueOf(i));

try {

sleep(1000);

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

}.start();



}

@Override

public void onDestroy() {

Log.i("TAG","Services onDestory");

isStop=true;//即使service销毁线程也不会停止,所以这里通过设置isStop来停止线程

super.onDestroy();

}



}


Activity代码:

package com.services;





import android.app.Activity;

import android.content.BroadcastReceiver;

import android.content.Context;

import android.content.Intent;

import android.content.IntentFilter;

import android.os.Bundle;

import android.view.View;

import android.view.View.OnClickListener;

import android.widget.Button;

import android.widget.ProgressBar;

import android.widget.TextView;



public class main extends Activity {

/** Called when the activity is first created. */

Button b1,b2,b3,b4;

TestService mService;

ProgressBar pb;

MyReceiver receiver;

TextView tv;

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

b1=(Button)findViewById(R.id.b1);

b2=(Button)findViewById(R.id.b2);

b3=(Button)findViewById(R.id.b3);

b4=(Button)findViewById(R.id.b4);

b1.setOnClickListener(l1);

b2.setOnClickListener(l2);

b3.setOnClickListener(l3);

b4.setOnClickListener(l4);

pb=(ProgressBar)findViewById(R.id.pb);

tv=(TextView)findViewById(R.id.tv);

}







public class MyReceiver extends BroadcastReceiver {

//自定义一个广播接收器

@Override

public void onReceive(Context context, Intent intent) {

// TODO Auto-generated method stub

System.out.println("OnReceiver");

Bundle bundle=intent.getExtras();

int a=bundle.getInt("i");

pb.setProgress(a);

tv.setText(String.valueOf(a));

//处理接收到的内容



}

public MyReceiver(){

System.out.println("MyReceiver");

//构造函数,做一些初始化工作,本例中无任何作用

}



}





OnClickListener l1=new OnClickListener(){



@Override

public void onClick(View v) {

// TODO Auto-generated method stub

startService(new Intent(main.this, TestService.class));

//开始服务

}



};

OnClickListener l2=new OnClickListener(){



@Override

public void onClick(View v) {

// TODO Auto-generated method stub

stopService(new Intent(main.this, TestService.class));

//结束服务

}



};

OnClickListener l3=new OnClickListener(){



@Override

public void onClick(View v) {

// TODO Auto-generated method stub

//注册接收器

receiver=new MyReceiver();

IntentFilter filter=new IntentFilter();

filter.addAction("android.intent.action.test");

main.this.registerReceiver(receiver,filter);

}



};

OnClickListener l4=new OnClickListener(){



@Override

public void onClick(View v) {

// TODO Auto-generated method stub

main.this.unregisterReceiver(receiver);

//解除注册接收器

}



};

}

分享到:
评论
1 楼 yk2fm 2012-05-03  
mark!!!

相关推荐

    Android入门.doc

    Broadcast receivers – 广播通知的接收者 Content providers – 数据的存储与获取 对组件的激活:Intent Manifest 文件 5. UI – 用户界面 6. 进一步学习的方法 阅读 android 指南(在 android-sdk-windows\docs ...

    Android入门到精通源代码.

    《Android从入门到精通》 第1章 初识Android 1.1 什么是Android 1.1.1 移动信息设备分类 1.1.2 Open Handset Alliance和 Android 1.2 Android简介 1.2.1 Andriod的历史 1.2.2 Andriod的未来 1.2.3 Andriod平台的技术...

    老罗android开发视频教程全集百度网盘下载

    Android基础阶段:平台架构特性(JAVA/C) Market/应用程序组件 环境搭建与部署/打包与发布 AVD/DDMS/AAPT 调试与测试 相关资源访问/资源制作 Activity/Service/Broadcast Receiver/Content Provider/原理(生命周期)及...

    新版Android开发教程.rar

    ----------------------------------- Android 编程基础 1 封面----------------------------------- Android 编程基础 2 开放手机联盟 --Open --Open --Open --Open Handset Handset Handset Handset Alliance ...

    《Google Android开发入门与实战》.pdf

    7.5 android应用的灵魂——intent和activity介绍与实例 106 7.5.1 实例操作演示 106 7.5.2 实例编程实现 106 7.6 用好列表,做好程序——列表(listview)介绍与实例 111 7.6.1 实例程序演示 111 7.6.2...

    android实习报告(1).doc

    实习内容: Android主要有四大组件,分别为:Activity 活动、Service 服务、Broadcast receivers 广播接受者、Content Provider 内容提供者。还有上激活组件Intent。 1.Activity Activity就是一个用户可以直接接触...

    android开发入门与实战(下)

    7.5 Android应用的灵魂——Intent和Activity介绍与实例 7.5.1 实例操作演示 7.5.2 实例编程实现 7.6 用好列表,做好程序——列表(ListView)介绍与实例 7.6.1 实例程序演示 7.6.2 实例编程实现 7.7 友好地互动交流...

    疯狂Android讲义源码

     第10章 Service与Broadcast  第10章 Receiver 373  10.1 Service简介 374  10.1.1 创建、配置Service 374  10.1.2 启动和停止Service 376  10.1.3 绑定本地Service并与之  通信 377  10.1.4 Service的生命...

    android开发入门教程

    第9章 我来“广播”你的“意图”——Intent和Broadcast面对面 9.1 Android应用程序的核心——Intent 9.1.1 Intent基础 9.1.2 用Intent启动一个新的Activity 9.1.3 Intent详细讲解 9.1.4 Android解析Intent实现 9.2 ...

    android开发入门与实战(上)

    7.5 Android应用的灵魂——Intent和Activity介绍与实例 7.5.1 实例操作演示 7.5.2 实例编程实现 7.6 用好列表,做好程序——列表(ListView)介绍与实例 7.6.1 实例程序演示 7.6.2 实例编程实现 7.7 友好地互动交流...

    疯狂Android讲义.part2

    第10章 Service与Broadcast 第10章 Receiver 373 10.1 Service简介 374 10.1.1 创建、配置Service 374 10.1.2 启动和停止Service 376 10.1.3 绑定本地Service并与之 通信 377 10.1.4 Service的生命周期 381 10.2 跨...

    疯狂Android讲义.part1

    第10章 Service与Broadcast 第10章 Receiver 373 10.1 Service简介 374 10.1.1 创建、配置Service 374 10.1.2 启动和停止Service 376 10.1.3 绑定本地Service并与之 通信 377 10.1.4 Service的生命周期 381 10.2 跨...

    Google.Android开发入门与实战

    本书作者较早就从事Android的研究与开发工作,为了帮助开发者更快地进入Android开发行列,他们不辞辛劳地编写了Android开发教程-《Google Android开发入门与实战》。本书系统讲解了Android软件开发的基础知识,...

    【推荐】超全的移动安全自学资料精编合集(43份).zip

    Android安全开发基础: 图形界面(UI)和碎片(Fragment)(上) Android安全开发基础: 图形界面(UI)和碎片(Fragment)(下) Android安全开发基础: 持久化技术 Android安全开发基础: 多媒体 Android安全开发基础:...

    Google Android开发入门与实战的代码

    Google Android开发入门与实战的代码 1章 掀起你的盖头来——初识Android. 1 1.1 认识Android 1 1.2 Android的背景 2 1.2.1 Android的历史 2 1.2.2 Android的发展 2 1.3 我的Android我做主 2 ...

    移动安全系列教学下载共43份.zip

    Android安全开发基础--10--图形界面(UI)和碎片(Fragment)(上).pdf Android安全开发基础--11--图形界面(UI)和碎片(Fragment)(下).pdf Android安全开发基础--12--持久化技术.pdf Android安全开发基础--13-...

    Android开发之多线程处理、Handler详解

    数据库操作以及网络下载需要很长时间,为了不阻塞用户界面,出现ANR  Android开发过程中为什么要多线程  我们创建的Service、Activity以及Broadcast均是一个主线程处理,这里我们可以理解为UI线程。但是在操作一些...

    [Android开发权威指南].李宁.扫描版.pdf

    第4章 我的UI我做主 用户界面开发基础 第5章 良好的学习开端 控件 Widget 详解 第6章 友好的菜单 Menu介绍与实例 第7章 友好地互动交流 信息提醒 对话框 Toast与Notification 第8章 移动的信息仓库 数据存储 第9章 ...

Global site tag (gtag.js) - Google Analytics