刚开始写博客,格式比较low,请见谅哈,重点看干货/呲牙。
andorid系统中有几个比较特殊好用的广播
其中系统静态广播
<action android:name="android.intent.action.BOOT_COMPLETED" /><!-- 开机广播 -->
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" /> <!-- /网络状态变化 -->
<action android:name="android.intent.action.USER_PRESENT" /> <!-- //解除锁屏 -->
<action android:name="android.intent.action.MEDIA_MOUNTED"/> <!-- SD卡挂载 -->
<action android:name="android.intent.action.MEDIA_UNMOUNTED"/> <!-- SD卡卸载 -->
系统需动态注册的广播
// 动态系统广播,因为性能的原因不能静态注册,所以通过自启动程序之后在这里进行动态注册
IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_SCREEN_ON); // 屏幕亮
filter.addAction(Intent.ACTION_SCREEN_OFF); // 屏幕灭
filter.addAction(Intent.ACTION_TIME_TICK); // 时间变化 每分钟一次
registerReceiver(myReceiver, filter);
其中开机广播需要加入权限
并且在安装的时候会有一个自动运行的提示,默认是关闭的需要手动点开启。
网上有人说3.1以后的版本开机广播收不到了,我测试的时候使用的是三星手机,小米手机和魅族手机由于对andorid原生系统有些改动需待测试,只要这个开关打开即可,并且在第一次安装之后打开过一次该应用(这个很重要不要忽略),原理大概是(android系统加了标志位避免流氓软件)。
<!--
1.android:exported ——此broadcastReceiver能否接收其他App的发出的广播,
这个属性默认值有点意思,其默认值是由receiver中有无intent-filter决定的,
如果有intent-filter,默认值为true,否则为false。(同样的,activity/service
中的此属性默认值一样遵循此规则)同时,需要注意的是,这个值的设定是以
application或者application user id为界的,而非进程为界(一个应用中可能含有多个进程);
2.android:name —— 此broadcastReceiver类名;
3.android:permission ——如果设置,具有相应权限的广播发送方发送的广播才能被此
broadcastReceiver所接收;
4.android:process ——broadcastReceiver运行所处的进程。默认为app的进程。
可以指定独立的进程(Android四大基本组件都可以通过此属性指定自己的独立进程)
5.之前常说:静态注册的广播接收器即使app已经退出,主要有相应的广播发出,依然可以接收到,
但此种描述自Android 3.1开始有可能不再成立
-->
<receiver android:name="com.example.receivertest.MyReceiver">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" /><!-- 开机广播 -->
<category android:name="android.intent.category.HOME" />
</intent-filter>
<intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" /> <!-- /网络状态变化 -->
<action android:name="android.intent.action.USER_PRESENT" /> <!-- //解除锁屏 -->
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.MEDIA_MOUNTED"/> <!-- SD卡挂载 -->
<action android:name="android.intent.action.MEDIA_UNMOUNTED"/> <!-- SD卡卸载 -->
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="file" />
</intent-filter>
<!-- 以上都是系统静态广播,可做自启动程序 -->
<intent-filter>
<action android:name="action.test.test" /><!-- 自定义的静态广播 (试试删掉还能不能接收到了?)-->
</intent-filter>
</receiver>
这一类的广播都可以通过BroadcastReceiver去接收到,然后直接处理。一般就是自定义一个这样的类
public class MyReceiver extends BroadcastReceiver{
private static final String TAG = "ReceiverTest";
public static int m = 1;
@Override
public void onReceive(Context ctx, Intent intent) {
// TODO Auto-generated method stub
final Context context = ctx;
//===============↓(静态系统广播,可做自启动程序)================
if (intent.getAction().equals(Intent.ACTION_USER_PRESENT)){//开机广播"android.intent.action.BOOT_COMPLETED"
Log.e(TAG, " 开机广播");
// Intent ootStartIntent=new Intent(context,MainActivity.class);
// ootStartIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
// context.startActivity(ootStartIntent);
//TODO 启动一个服务,负责log数据上传
Intent startServiceIntent = new Intent(context, MyService.class);
startServiceIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startService(startServiceIntent);
}else if(intent.getAction().equals(Intent.ACTION_USER_PRESENT)){// 解除锁屏
Log.e(TAG, " 解除锁屏");
}else if(intent.getAction().equals(ConnectivityManager.CONNECTIVITY_ACTION)){// 网络状态变化
Log.e(TAG, "网络状态变化");
}//===============↓(动态系统广播,因系统性能不可以静态)================
else if(intent.getAction().equals(Intent.ACTION_SCREEN_ON)){// 开屏
Log.e(TAG, " 开屏广播");
}else if(intent.getAction().equals(Intent.ACTION_SCREEN_OFF)){// 锁屏(动态系统广播,因系统性能不可以静态)
Log.e(TAG, "锁屏广播");
}else if(intent.getAction().equals(Intent.ACTION_TIME_TICK)){//时间变化 每分钟一次 (动态系统广播,因系统性能不可以静态)
Log.e(TAG, "时间变化一分钟一次");
}
}
}
好了,这篇就这么多先,如果有需要请留言,我后续补充。在下面两篇文章我会献上统一的demo。不然实在代码量太少。