本节学习系统中特殊的广播接收者。
我们前面几节不是说了,当广播接受者一旦注冊到系统中,当系统发送的广播和你注冊的广播的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>执行效果例如以下:
ok。 就到这里。大家了解下即可