当前位置: 代码迷 >> Android >> Android 四大组件学习之BroadcastReceiver4
  详细解决方案

Android 四大组件学习之BroadcastReceiver4

热度:19   发布时间:2016-04-27 23:47:33.0
Android 四大组件学习之BroadcastReceiver四

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

我们前面几节不是说了,当广播接受者一旦注册到系统中,当系统发送的广播和你注册的广播的action匹配时,系统就会启动广播接收者所在的进程。除非用户手动停止广播接收者所在的进程。但是生活中有这样一种情况,比如说:我在玩网络游戏,假设说游戏本身在系统电量低的情况下,会自动保存当前游戏的进度,也就是存档的。可以这么说,此广播接受者只有在用户玩游戏时才需要启动,别的时候用户是不需要的。如果此广播接收者一直常驻于系统,那不是很浪费系统资源。所以我们就需要动态的启动广播接收者,和停止广播接收者。可是大家知道,广播接收者只要在清单文件中注册过了的,就会永远启动的。所以唯一的办法就是不在清单文件中注册,在代码中动态注册。


说了这么多,就是说可以用代码动态的注册广播接收者。

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


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

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

Activity的代码:也就是两个按钮,一个用于创建创建服务,一个用于停止服务

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。 就到这里,大家了解下就行






版权声明:本文为博主原创文章,未经博主允许不得转载。

  相关解决方案