首页 技术 正文
技术 2022年11月21日
0 收藏 898 点赞 3,430 浏览 2595 个字

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

我们前面几节不是说了,当广播接受者一旦注冊到系统中,当系统发送的广播和你注冊的广播的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。 就到这里。大家了解下即可

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,077
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,552
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,401
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,176
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,813
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,896