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";

// 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的广播,然后取出数据,更新画面。

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的广播,代码如下:

<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方式实现远程服务之间的通信,这种方式将在下一节中介绍。

更多相关文章

  1. android 网络数据抓包
  2. Android(安卓)存储学习之SQLite数据库的基本操作
  3. android直接读取项目中的sqlite数据库
  4. Android(安卓)Sqlite数据库查询或删除N天前数据
  5. 我心中的Android(安卓)REST Client--9gag
  6. 从零开始学习Android(二)从架构开始说起
  7. Android(安卓)GreenDao实现CRUD和升级详解
  8. Android图表之-Echarts
  9. android获取某应用的帧数据

随机推荐

  1. 去掉前面的0的sql语句(前导零,零前缀)
  2. sqlserver 多库查询 sp_addlinkedserver
  3. sqlserver 三种分页方式性能比较[图文]
  4. SQL学习笔记七函数 数字,日期,类型转换,空值
  5. SQL学习笔记八 索引,表连接,子查询,ROW_NUMB
  6. SQL学习笔记六 union联合结果集使用
  7. SQL学习笔记五去重,给新加字段赋值的方法
  8. SQL学习笔记四 聚合函数、排序方法
  9. SQL学习笔记三 select语句的各种形式小结
  10. SQL学习笔记二 创建表、插入数据的语句