本节学习系统中特殊的广播接收者。

我们前面几节不是说了,当广播接受者一旦注冊到系统中,当系统发送的广播和你注冊的广播的action匹配时,系统就会启动广播接收者所在的进程。除非用户手动停止广播接收者所在的进程。但是生活中有这样一种情况,比方说:我在玩网络游戏,如果说游戏本身在系统电量低的情况下,会自己主动保存当前游戏的进度。也就是存档的。能够这么说。此广播接受者仅仅有在用户玩游戏时才须要启动,别的时候用户是不须要的。

如果此广播接收者一直常驻于系统。那不是非常浪费系统资源。

所以我们就须要动态的启动广播接收者。和停止广播接收者。但是大家知道。广播接收者仅仅要在清单文件里注冊过了的,就会永远启动的。

所以唯一的办法就是不在清单文件里注冊,在代码中动态注冊。

说了这么多。就是说能够用代码动态的注冊广播接收者。

说到在代码中注冊广播接收者,那Android系统中规定。屏幕锁屏和解锁,以及电量改变必须用代码注冊。在清单文件里注冊是不起作用的。那是由于,屏幕锁屏和解锁,以及电量改变事件太频繁发生了。假设在清单文件里注冊,将会对系统消耗非常大。

那我们就用屏幕解锁和锁屏实现代码中注冊广播接收者

这次我们用服务去创建广播接收者

Activity的代码:也就是两个button。一个用于创建创建服务。一个用于停止服务

public class MainActivity extends Activity {

	Intent intent;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
intent = new Intent(this, ScreenService.class);
} //启动服务
public void openScreen(View v)
{
Log.i("MainActivity", "启动广播接收者服务");
startService(intent);
} //关闭服务
public void closeScreen(View v)
{
Log.i("MainActivity", "关闭广播接收者服务");
stopService(intent);
}
}

然后Service的代码:

public class ScreenService extends Service {

	private ScreenReceiver sReceiver;
@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return null;
} @Override
public void onCreate() {
// 注冊广播接收者
super.onCreate();
//创建一个广播接收者
sReceiver = new ScreenReceiver(); //指定接收那种类型的广播
IntentFilter filter = new IntentFilter();
//指定关屏幕和开屏幕
filter.addAction(Intent.ACTION_SCREEN_OFF);
filter.addAction(Intent.ACTION_SCREEN_ON);
//注冊广播接收者
registerReceiver(sReceiver, filter);
Log.i("ScreenService", "广播接受者已注冊");
} @Override
public void onDestroy() {
// 销毁广播接收者
super.onDestroy();
unregisterReceiver(sReceiver);
Log.i("ScreenService", "广播接受者已销毁");
}
}

在Service的onCreate方法中注冊广播接收者。在Destory方法中销毁广播接收者

终于广播接收者的代码:

public class ScreenReceiver extends BroadcastReceiver {

	@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
String action = intent.getAction(); if(Intent.ACTION_SCREEN_OFF.equals(action))
{
//接收到管屏幕的广播
Log.i("ScreenReceiver", "屏幕关闭!");
}
else if(Intent.ACTION_SCREEN_ON.equals(action))
{
//接收到开屏幕的广播
Log.i("ScreenReceiver", "屏幕开启!");
}
}
}

清单文件里,须要要配置服务,广播接收者不须要配置

    <application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<service android:name="com.demo.screenactivity.ScreenService"></service>
</application>

执行效果例如以下:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

ok。 就到这里。大家了解下即可

Android 四大组件学习之BroadcastReceiver四的更多相关文章

  1. Android 四大组件学习之BroadcastReceiver一

    本节课学习四大组件最后一个, 广播接受者. 顾名思义广播接受者就是接受广播呗.比方在现实社会中,曾经每一个人家都有一台收音机,这可就能够去接受广播发出来的消息.大家都知道.程序世界也是參照的显示生活设 ...

  2. Android 四大组件学习之BroadcastReceiver三

    本节学习广播的分类. 广播分为无序广播和有序广播 无序广播: 广播发送者的action与广播接收者的action都匹配的话,所以广播介绍者都能够收到这条广播,而且没有先后顺序,能够觉得是同一时候收到 ...

  3. Android 四大组件学习之BroadcastReceiver二

    上节学习了怎样创建一个广播.也尝试接受系统打电话的广播. 本节课学习怎样自己定义广播.自己定义广播实质上也就是创建一个发送广播者,创建一个接受该广播者. 那我们就開始行动吧. 先创建一个发送广播的应用 ...

  4. Android 四大组件学习之ContentProvider四

    上节我们学习了怎样去读取系统短信以及插入一条短信到系统中. 本节我们学习怎样获取系统的联系人,以及插入一条联系人 好.废话不多说了,直接操作. 首先和读取短信一样,先找到联系人在数据库中的位置. wa ...

  5. Android 四大组件学习之Server一

    上次学习了Android四大组件Activity之后,我们深刻理解了Activity.这次我们学习四大组件Service. Service与Activity的级别是一样的,都是Android系统不可缺 ...

  6. android四大组件学习总结以及各个组件示例(1)

    android四大组件分别为activity.service.content provider.broadcast receiver. 一.android四大组件详解 1.activity (1)一个 ...

  7. Android四大组件之一:BroadCastReceiver(广播接收者)

    广播接受者是(BroadCastReceiver)是Android中的地大组件之一,之前学习了一些关于BroadCastReceiver方面的知识,今天回过头来发现已经快忘记的差不多了,毕竟现在是刚开 ...

  8. Android 四大组件学习之ContentProvider二

    上节学习了什么是ContentProvider.以及ContentProvider的作用.以及什么是URL.本节就对上节学习的知识做一个实践,也就是定义自己的ContentProvider 好.实践是 ...

  9. android四大组件学习总结以及各个组件示例(2)

    上篇博文讲解了activity.content provider,此篇博文来仔细总结service.broadcast receiver: 3. Service >什么是服务?>windo ...

随机推荐

  1. 分享3个Putty配色方案【转】

    本文转载自:https://www.coder4.com/archives/1506 分享3个Putty配色方案 4 Replies 虽然服务器都是Linux的,平时也基本用Linux,但是难免还是要 ...

  2. 最全三大框架整合(使用映射)——applicationContext.xml里面的配置

    applicationContext.xml: <?xml version="1.0" encoding="UTF-8"?> <beans x ...

  3. WEEX学习网站

    https://github.com/alibaba/weex https://alibaba.github.io/weex/  官网     http://weex.help/topic/57792 ...

  4. [Pulgin] 前端上传组件Plupload使用指南

    我之前写过一篇文章<文件上传利器SWFUpload使用指南>,里面介绍了上传组件SWFUpload的使用方法,但现在随着html5技术的逐渐推广和普及,再去使用以flash为上传手段的SW ...

  5. eclipse中文汉字看不清或过小的问题解决方法!!

    把字体修改为 中欧字体就可以看清汉字

  6. art-template简单使用

    art-template是一款较通用的前端模板引擎. 简单的使用方法如下: 具备3个要素 1)模板 <script type="text/template" id=" ...

  7. 【Five-Minute Share】数据库内存分配设置

    对于数据库分配的内存,经常会看到的一条准则是:将服务器75-80%的内存分配给数据库.这是一条比较常见的准则,但并不是绝对的.首先,我们需要保障操作系统运行本身所需的充足内存后,才能去考虑数据库所分配 ...

  8. swift pragma mark

    众所周知,大家在OC中对代码进行逻辑组织 用的是#pragma mark - ,生成分隔线 用#pragma mark 函数说明,来生成一个函数的说明X 但在swift中,这个语法就不支持了,毕竟它是 ...

  9. C# model代码生成器

    using System.Collections.Generic; using System.Text; public class Class1 { //传递 1.表名 2.列名 3.类型 publi ...

  10. 一个单元格占两行三列的HTML代码为

    主要是这两个属性: colspan 单元格占多少列 rowspan 单元格占多少行 <table width="200" border="1">&l ...