广播接收者不同版本中的特性
- 自Android 3.1之后,所有新安装但未被执行过的apk,以及那些被用户强行停止的apk,都会处于stopped状态。这个状态下,apk中的广播接收者,均处于未激活状态, 无法履行监听功能。
-
在广播发发送方发送广播时需要设置Intent.FLAGINCLUDESTOPPED_PACKAGES
Intent intent = new Intent(); intent.setAction("com.wlj.broadcast"); if (android.os.Build.VERSION.SDK_INT >= 12) { intent.setFlags(32);//3.1以后的版本需要设置Intent.FLAG_INCLUDE_STOPPED_PACKAGES } sendBroadcast(intent);
如何发送和接收自定义广播
-
发送
Intent intent = new Intent(); //自定义action intent.setAction("com.wlj.ccav.XWLB"); //可以添加参数 intent.putExtra("key", "dfafadfa"); sendBroadcast(intent);
-
接收
<receiver android:name="com.wlj.myreceiver.MyReceiver"> <intent-filter > //填写要接收自定义广播的action <action android:name="com.wlj.ccav.XWLB"/> </intent-filter> </receiver>
有序广播和无序广播的区别
- 有序广播
- 广播消息是按照一定的顺序传达的,高优先级的先得到广播消息,低优先级的后得到
- 高优先级的可以拦截广播消息或者修改广播消息
- 效率比较低
- 无序广播
- 广播消息没有顺序,同时接受广播消息
- 不可以修改广播消息
- 效率高
如何发送有序广播
Intent intent = new Intent();
intent.setAction("com.wlj.gov.SENDMASHROOM");
// 发送有序广播
// intent 意图
// receiverPermission 权限 默认null
// resultReceiver 结果接受者 null
// scheduler 消息处理器 null 默认
// initialCode 初始化码
// initialData 初始化数据
// initialExtras null 额外的数据
sendOrderedBroadcast(intent, null, null, null, 1, "主席讲话: 每人10斤蘑菇", null);
有序广播的特点
-
优先级在哪里配置,范围是多少
<receiver android:name="com.wlj.smslistener.SmsReceiver"> //在此处配置,范围从1000到-1000 <intent-filter android:priority="1000"> <action android:name="android.provider.Telephony.SMS_RECEIVED"/> </intent-filter> </receiver>
-
如何获取数据,如何修改数据
//获取数据 String data = getResultData();
//修改数据 setResultData("发一个广播试试");
-
如何终止有序广播
abortBroadcast();
-
resultReceiver什么时候收到广播,需要在清单文件中配置吗
1.在所有广播接收者都收到消息后接受到广播 2.即使有广播接收者终止了广播,resultReceiver也可以接收到广播 3.不需要在清单文件中配置
如何动态注册广播接收者
receiver = new ScreenStatusReceiver();
IntentFilter filter = new IntentFilter();
filter.addAction("android.intent.action.SCREEN_OFF");
filter.addAction("android.intent.action.SCREEN_ON");
registerReceiver(receiver, filter);
动态注册广播接收者的特点
- 在android里面有一些产生非常频繁的广播事件,在清单文件里面配置是不会生效。电量变化、屏幕锁屏、解锁,这些广播事件只能利用代码注册
-
动态注册的广播接收者可以将其关闭掉
unregisterReceiver(receiver);
服务
长期后台运行,没有界面的组件,服务是运行在当前应用程序进程里面
如何创建一个服务
-
创建一个类继承Service
public class DemoService extends Service { }
-
在清单文件的application节点中进行配置
<service android:name="com.wlj.servicedemo.DemoService" > </service>
如何开启和关闭服务
-
开启服务
Intent intent = new Intent(this,DemoService.class); startService(intent);
-
关闭服务
Intent intent = new Intent(this,DemoService.class); stopService(intent);
服务创建和销毁的生命周期方法
- 服务创建:onCreate
- 服务销毁:onDestroy
服务运行在那个线程
运行在主线程,不能执行耗时操作
进程的优先级
-
Foreground process
前台进程:用户正在操作的应用程序所在的进程就是前台进程 -
Visible process
可视进程:用户已经不能操作这个应用程序了,但是界面用户仍然可以看到 -
Service process
服务进程:应用程序有一个服务代码正在运行 -
Background process
后台进程:应用程序有界面,但是界面被用户最小化(点击home键),或者开启了另一个界面,当前界面不可见了 -
Empty process
空进程:应用程序没有任何运行的Activity、Service
前台进程 > 可视进程 > 服务进程 > 后台进程 > 空进程
为什么需要服务
-
当应用程序退出后,如果里面只有一个子线程,那么这个进程就会被当作一个空进程,优先级很低。当内存不足的时候,会被很快的被回收了
-
而如果开了一个服务的话,就算把程序退出了,那么这个进程也是一个服务进程,优先级中等,轻易不会被回收!即使被回收了,在内存充足的时候也会被重新开启
服务的生命周期
-
多次调用startService()的方式开启服务,服务只会被创建一次,在创建的时候执行onCreate()方法,一旦服务创建完毕,再去开启service就不会重复执行onCreate()方法了,只会执行onStart()和onStartCommand()
-
调用stopService()停止服务,执行ondestroy()方法,服务只会被停止一次