Android 冷知识(1)开机广播及一些特殊广播

刚开始写博客,格式比较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。不然实在代码量太少。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值