服务与活动

发布时间:2016-12-7 0:03:32 编辑:www.fx114.net 分享查询网我要评论
本篇文章主要介绍了"服务与活动",主要涉及到服务与活动方面的内容,对于服务与活动感兴趣的同学可以参考一下。

声明:eoe文章著作权属于作者,受法律保护,转载时请务必以超链接形式附带如下信息 原文作者: ooluffy 原文地址: http://my.eoe.cn/508206/archive/4836.html   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,有时候也需要通知前台的Activity,向Activity发送一些数据。例如,当数据下载已经完成或者音乐播放结 束时,为了降低程序的耦合,使用Intent在Service和Activity之间通信是一个不错的方案。在Activity中注册一个 BroadcastReceiver,当Service有数据发送给Activity时,构建一个Intent并调用sendBroadcast()方法 将数据发送给Activity。 在chapter8_1的基础上做适当修改,使得音乐播放结束后,MainActivity可以收到来自MusicService的通知。首先,为 MediaPlayer注册一个OnCompletionListener,当音乐播放结束后,向MainActivity发送Intent。 MediaPlayer.OnCompletionListener listener = new MediaPlayer.OnCompletionListener() { public void onCompletion(MediaPlayer arg0) { 1 2 3 4 5 6 7 8 9 //MusicService使用广播方式向MainActivity发送数据 Intent intent = new Intent(MUSIC_COMPLETED); intent.putExtra("msg", getText(R.string.music_completed)); sendBroadcast(intent); } }; 接下来,要为MainActivity注册一个BroadcastReceiver,来监听来自MusicService的信息。当 MusicReceiver接收到来自MusicService的广播后,弹出一个Toast提示用户。MainActivity增加的代码如下所示: class MusicReceiver extends BroadcastReceiver { 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 @Override public void onReceive(Context arg0, Intent arg1) { String action = arg1.getAction(); if (action.equals(MusicService.MUSIC_COMPLETED)) { //从MusicService接收广播消息,弹出Toast String msg = arg1.getStringExtra("msg"); Toast.makeText(MainActivity.this, msg, Toast.LENGTH_SHORT) .show(); } } } @Override protected void onPause() { 1 2 3 4 5 //注销BroadcastReceiver unregisterReceiver(receiver); super.onPause(); } @Override protected void onResume() { 1 IntentFilter filter = new IntentFilter (MusicService.MUSIC_COMPLETED); 1 2 3 4 5 6 7 8 9 if (receiver == null) receiver = new MusicReceiver(); //注册BroadcastReceiver registerReceiver(receiver, filter); super.onResume(); } 如 果有多个Activity需要注册BroadcastReceiver来监听来自Service的消息该怎么办?一个一个注册,显然比较麻烦。可以通过定 义一个父Activity来注册BroadcastReceiver,其他的Activity继承这个父类,达到简化程序的目的。  

上一篇:SQLServerDBA十大必备工具
下一篇:01背包问题

相关文章

关键词: 服务与活动

相关评论