Android前台画面和后台service之间通信的方法之Broadcast
2011-09-19 13:31
525 查看
转自:http://blog.csdn.net/ameyume/article/details/6290137
Android中service的作用相信大家都很清楚了,主要是在后台执行操作,没有画面,类似于windows中的服务(service); 并且可以在前台activity画面退出时,继续执行后台的服务。
启动service的方法有两种,一种是startService,一种是bindService,都是通过Intent作为媒介来启动service的。如果用户是用startService方式启动的服务,想从后台service发送数据给前台,执行画面显示或者更新,那该如何实现呢?这是就可以使用android系统的broadcast组件,通过广播的形式在servcie中发送广播,通过启动广播时的Intent传送需要更新的数据,当前台activity接收到这个广播后,就可以执行数据显示或者更新画面操作了。
例如,有个音乐播放程序,前台Activity是MusicDemo类,后台播放音乐的类是MusicService类。在播放时,需要在view中显示当前正在播放歌曲的曲名,专辑,演唱者,歌曲时长等信息,此时就可以在MusicService中发送广播给MusciDemo类,当前台Activity接收到数据时,显示歌曲信息。
1.在MusicService.java中:
通过sendBroadcast()发送广播,并且把数据放在intent中
其中字符串Common.NUM_COUNT_RECEIVER的定义为:
public static final String NUM_COUNT_RECEIVER = "com.min.musicdemo.action.NUM_COUNT";
view plainprint?
// send information to update view
Intent intent1 = new Intent(Common.NUM_COUNT_RECEIVER);
intent1.putExtra("num", mPlayPosition + 1);
intent1.putExtra("count", mCursor.getCount());
intent1.putExtra("artist", artist);
intent1.putExtra("album", album);
intent1.putExtra("title", title);
intent1.putExtra("totalSeconds", mMediaPlayer.getDuration() / 1000);
sendBroadcast(intent1);
2.在MusicDemo类中定义继承自BroadcastReceiver的内部类InnerReceiver,用于接收广播。
在InnerReceiver类的onReceive函数中接收action为Common.MUSIC_LIST_RECEIVER的广播,然后取出数据,更新画面。
view plainprint?
public class MusicDemo extends Activity implements OnClickListener {
...
// broadcast receiver
public static class InnerReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(Common.NUM_COUNT_RECEIVER)) {
// Log.d(TAG, "*********** NUM_COUNT_RECEIVER Start **********" + Common.getDate());
try{
int num = intent.getIntExtra("num", 1);
int count = intent.getIntExtra("count", 1);
String artist = intent.getStringExtra("artist");
String album = intent.getStringExtra("album");
String title = intent.getStringExtra("title");
int totalSecond = intent.getIntExtra("totalSeconds", 1);
// set music name to screen title
tvTitleMusicName.setText(title);
tvTitleNumCount.setText(num + "/" + count);
// play second
tvTotalSeconds.setText(String.format("%1$02d:%2$02d",
totalSecond / 60, totalSecond % 60));
// play information
SetMusicArtist(artist, title);
tvVPArtist.setText(artist); // 艺术家
tvVPAlbum.setText(album); // 专辑
}catch(Exception e) {
Log.e(TAG, "receive NUM_COUNT error!!!!!");
e.printStackTrace();
}
}
}
}
3.需要在manifest文件中把MusciDemo的子类InnerReceiver注册为广播接收者(receiver),这样才能接收到action为Common.NUM_COUNT_RECEIVER的广播,代码如下:
view plainprint?
<receiver android:name=".MusicDemo$InnerReceiver"> <intent-filter> <action android:name="com.min.musicdemo.action.NUM_COUNT"/> </intent-filter> <intent-filter> <action android:name="com.min.musicdemo.action.MUSIC_LIST"/> </intent-filter> </receiver>
以上就是通过广播从service传送数据到activity的一种方法,这种方法的好处是简单意义,直接使用android提供的Broadcast组件。
缺点就是使用了系统的广播体制,需要通过系统的消息队列,效率上不太高。
好的方法是通过bindService来实现activity和service之间的通信,以及AIDL方式实现远程服务之间的通信,这种方式将在下一节中介绍。
Android中service的作用相信大家都很清楚了,主要是在后台执行操作,没有画面,类似于windows中的服务(service); 并且可以在前台activity画面退出时,继续执行后台的服务。
启动service的方法有两种,一种是startService,一种是bindService,都是通过Intent作为媒介来启动service的。如果用户是用startService方式启动的服务,想从后台service发送数据给前台,执行画面显示或者更新,那该如何实现呢?这是就可以使用android系统的broadcast组件,通过广播的形式在servcie中发送广播,通过启动广播时的Intent传送需要更新的数据,当前台activity接收到这个广播后,就可以执行数据显示或者更新画面操作了。
例如,有个音乐播放程序,前台Activity是MusicDemo类,后台播放音乐的类是MusicService类。在播放时,需要在view中显示当前正在播放歌曲的曲名,专辑,演唱者,歌曲时长等信息,此时就可以在MusicService中发送广播给MusciDemo类,当前台Activity接收到数据时,显示歌曲信息。
1.在MusicService.java中:
通过sendBroadcast()发送广播,并且把数据放在intent中
其中字符串Common.NUM_COUNT_RECEIVER的定义为:
public static final String NUM_COUNT_RECEIVER = "com.min.musicdemo.action.NUM_COUNT";
view plainprint?
// send information to update view
Intent intent1 = new Intent(Common.NUM_COUNT_RECEIVER);
intent1.putExtra("num", mPlayPosition + 1);
intent1.putExtra("count", mCursor.getCount());
intent1.putExtra("artist", artist);
intent1.putExtra("album", album);
intent1.putExtra("title", title);
intent1.putExtra("totalSeconds", mMediaPlayer.getDuration() / 1000);
sendBroadcast(intent1);
// send information to update view Intent intent1 = new Intent(Common.NUM_COUNT_RECEIVER); intent1.putExtra("num", mPlayPosition + 1); intent1.putExtra("count", mCursor.getCount()); intent1.putExtra("artist", artist); intent1.putExtra("album", album); intent1.putExtra("title", title); intent1.putExtra("totalSeconds", mMediaPlayer.getDuration() / 1000); sendBroadcast(intent1);
2.在MusicDemo类中定义继承自BroadcastReceiver的内部类InnerReceiver,用于接收广播。
在InnerReceiver类的onReceive函数中接收action为Common.MUSIC_LIST_RECEIVER的广播,然后取出数据,更新画面。
view plainprint?
public class MusicDemo extends Activity implements OnClickListener {
...
// broadcast receiver
public static class InnerReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(Common.NUM_COUNT_RECEIVER)) {
// Log.d(TAG, "*********** NUM_COUNT_RECEIVER Start **********" + Common.getDate());
try{
int num = intent.getIntExtra("num", 1);
int count = intent.getIntExtra("count", 1);
String artist = intent.getStringExtra("artist");
String album = intent.getStringExtra("album");
String title = intent.getStringExtra("title");
int totalSecond = intent.getIntExtra("totalSeconds", 1);
// set music name to screen title
tvTitleMusicName.setText(title);
tvTitleNumCount.setText(num + "/" + count);
// play second
tvTotalSeconds.setText(String.format("%1$02d:%2$02d",
totalSecond / 60, totalSecond % 60));
// play information
SetMusicArtist(artist, title);
tvVPArtist.setText(artist); // 艺术家
tvVPAlbum.setText(album); // 专辑
}catch(Exception e) {
Log.e(TAG, "receive NUM_COUNT error!!!!!");
e.printStackTrace();
}
}
}
}
public class MusicDemo extends Activity implements OnClickListener { ... // broadcast receiver public static class InnerReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { if (intent.getAction().equals(Common.NUM_COUNT_RECEIVER)) { // Log.d(TAG, "*********** NUM_COUNT_RECEIVER Start **********" + Common.getDate()); try{ int num = intent.getIntExtra("num", 1); int count = intent.getIntExtra("count", 1); String artist = intent.getStringExtra("artist"); String album = intent.getStringExtra("album"); String title = intent.getStringExtra("title"); int totalSecond = intent.getIntExtra("totalSeconds", 1); // set music name to screen title tvTitleMusicName.setText(title); tvTitleNumCount.setText(num + "/" + count); // play second tvTotalSeconds.setText(String.format("%1$02d:%2$02d", totalSecond / 60, totalSecond % 60)); // play information SetMusicArtist(artist, title); tvVPArtist.setText(artist); // 艺术家 tvVPAlbum.setText(album); // 专辑 }catch(Exception e) { Log.e(TAG, "receive NUM_COUNT error!!!!!"); e.printStackTrace(); } } } }
3.需要在manifest文件中把MusciDemo的子类InnerReceiver注册为广播接收者(receiver),这样才能接收到action为Common.NUM_COUNT_RECEIVER的广播,代码如下:
view plainprint?
<receiver android:name=".MusicDemo$InnerReceiver"> <intent-filter> <action android:name="com.min.musicdemo.action.NUM_COUNT"/> </intent-filter> <intent-filter> <action android:name="com.min.musicdemo.action.MUSIC_LIST"/> </intent-filter> </receiver>
<receiver android:name=".MusicDemo$InnerReceiver"> <intent-filter> <action android:name="com.min.musicdemo.action.NUM_COUNT"/> </intent-filter> <intent-filter> <action android:name="com.min.musicdemo.action.MUSIC_LIST"/> </intent-filter> </receiver>
以上就是通过广播从service传送数据到activity的一种方法,这种方法的好处是简单意义,直接使用android提供的Broadcast组件。
缺点就是使用了系统的广播体制,需要通过系统的消息队列,效率上不太高。
好的方法是通过bindService来实现activity和service之间的通信,以及AIDL方式实现远程服务之间的通信,这种方式将在下一节中介绍。
相关文章推荐
- Android前台画面和后台service之间通信的方法之Broadcast
- Android前台画面和后台service之间通信的方法之Broadcast
- Android前台画面和后台service之间通信的方法之Broadcast
- Android Service与Activity之间通信的几种方式(1)---通过broadcast(广播)的形式
- [android]Android Activity和Service之间的通信
- Web后台和Android前端之间的网络通信
- Android之Activity ContentProvider Service Broadcast,线程间通信,AIDL(二)
- Android开发中Activity与Service之间getSharedPreferences不同步的解决方法
- Android Framework------之ActivityManagerService与Activity之间的通信
- activity和service之间的相互通信方法
- Android中的跨进程通信方法实例及特点分析(一):AIDL Service
- Android Service与Activity之间通信的几种方式
- Android Service与Activity之间通信的几种方式
- Android基础--Service与Activity之间通信的几种方式
- Android中Activity、Service和线程之间的通信
- Android 启动Service服务和发送Broadcast广播的常用方法
- Android Service与Activity之间通信的几种方式
- Android实现Activity、Service与Broadcaster三大组件之间互相调用的方法详解
- Android之Activity ContentProvider Service Broadcast,线程间通信,AIDL(三)
- Android手机之间通过声音传输信息方法——声波通信(含工程代码)