说明: 我们的app有时候有设置开机是否自启动的需求。开机自启动其实很简单。

要设置自启动,首先,我们要让app能够自己启动:

第一步实现自启动

1、权限不能没有:

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

2、我们需要一个广播:这里的MainActivity.class是你想要启动的Activity

public class BootReceiver extends BroadcastReceiver {  
    @Override  
    public void onReceive(Context context, Intent intent) {  
        if(intent.getAction().equals("android.intent.action.BOOT_COMPLETED")) {   
            Intent intent2 = new Intent(context, MainActivity.class);   
            intent2.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            context.startActivity(intent2); 
        }  
    }  
}

3、还要注册这个广播,这里要说的是,开机完成的广播是系统广播,不允许在代码里面注册:

<receiver android:name=".BootReceiver" >  
            <intent-filter>  
                <action android:name="android.intent.action.BOOT_COMPLETED" />            
                <category android:name="android.intent.category.LAUNCHER" />  
            </intent-filter>  
       </receiver>

到这里,自启动就能实现了。

第二步控制是否自启动:

之前一直觉得,用SharedPreferences存一个标志就能实现,比如

public class BootReceiver extends BroadcastReceiver {  
    public final static String AUTO_START = "AUTO_START";
    @Override  
    public void onReceive(Context context, Intent intent) {  
            if(intent.getAction().equals("android.intent.action.BOOT_COMPLETED")) {   

    SharedPreferences  settings = context.getSharedPreferences(AUTO_START,Context.MODE_PRIVATE);                    
    if(settings.getBoolean("AUTO_START", false)){
         Intent intent2 = new Intent(context, MainActivity.class);   
         intent2.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                context.startActivity(intent2); 
           }
        }  
    }  
}

然而发现,并没有什么用,这里都取不到这个SharedPreferences存的值,我也不知为毛,那就只能找其他方法了;
在互联网的世界游荡,终于看到了这个标题。“Android禁用和开启四大组件的方法”原文:,当时就懵逼了,四大组件还能禁用?


当我们设置开机禁止自启动的时候:只要把我们的BootReceiver干掉就行了;
具体如下:

private void setComponentEnabled(Class<?> clazz, boolean enabled) {  
        final ComponentName c = new ComponentName(this, clazz.getName());  
        getPackageManager().setComponentEnabledSetting(c,  
                enabled ? PackageManager.COMPONENT_ENABLED_STATE_ENABLED  
                        : PackageManager.COMPONENT_ENABLED_STATE_DISABLED,  
                PackageManager.DONT_KILL_APP);  
    }

先说下这两个参数。第一个:BootReceiver.class,第二个:就是你的开机是否自启动boolean值了;

再说一下这个方法:
setComponentEnabledSetting (ComponentName componentName, int newState, int flags)
componentName:组件名称
newState:组件新的状态,可以设置三个值,分别是如下:
不可用状态:COMPONENT_ENABLED_STATE_DISABLED
可用状态:COMPONENT_ENABLED_STATE_ENABLED
默认状态:COMPONENT_ENABLED_STATE_DEFAULT
flags:行为标签,值可以是DONT_KILL_APP或者0。 0说明杀死包含该组件的app。

到这里app设置开机是否自启动就完工了;
不过我还是想啰嗦一句:希望大家还是看一看
大家都知道,现在的手机,有自带内存的,还有可以插SD卡的,在Android API Level大于8的时候,程序是可以安装在SD卡上的。那么问题又来了,很不幸的,你的app被用户安装在SD卡,可是SD卡挂载是在BOOT_COMPLETED这广播发送之后才开始的,So,你的app一样不能启动。但是别担心啊:Android框架说:Don’t call me, I’ll call you back。SD挂载完成了,一样是有广播的。去监听这个广播就行了。