刚开始写博客,格式比较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);

其中开机广播需要加入权限


并且在安装的时候会有一个自动运行的提示,默认是关闭的需要手动点开启。

android开机广播 开机广播权限_android开机广播


网上有人说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。不然实在代码量太少。