开机自启动(整合)

来源:互联网 发布:财务评价软件 编辑:程序博客网 时间:2024/06/18 16:23

1.android:name="android.permission.RECEIVE_BOOT_COMPLETED" 加权限

2.需要的广播接收注册(如果还要启动服务,也先注册)

  1. <!-- 开机自启动广播接受 -->  
  2. <receiver android:name="com.example.autostart.AutoStartBroadcastReceiver" >  
  3.     <intent-filter>  
  4.         <action android:name="android.intent.action.BOOT_COMPLETED" />  
  5.     </intent-filter>  
  6. </receiver>  
  7.   
  8. <!-- 开机自启动服务-->  
  9.  <service android:name="com.example.autostart.AutoStartService"  
  10.     android:label="AutoStartService"  
  11.     android:enabled="true"  
  12.     android:exported="true"  
  13.     android:process=":remote"




  1. 3.BroadcastReceiver
    1. com.example.autostart;  
    2.   
    3. import android.content.BroadcastReceiver;  
    4. import android.content.Context;  
    5. import android.content.ContextWrapper;  
    6. import android.content.Intent;  
    7. import android.content.SharedPreferences;  
    8.   
    9. //开机自启动广播接受  
    10. public class AutoStartBroadcastReceiver extends BroadcastReceiver {  
    11.     private static final String ACTION = "android.intent.action.BOOT_COMPLETED";  
    12.     private SharedPreferences mPreferences = null;  
    13.   
    14.     @Override  
    15.     public void onReceive(Context context, Intent intent) {  
    16.   
    17.         mPreferences = context.getSharedPreferences("AutoStart",  
    18.                 ContextWrapper.MODE_PRIVATE);  
    19.           
    20.         if (intent.getAction().equals(ACTION)) {  
    21.               
    22.             if (mPreferences.getBoolean("AddToAuto"false)) {  
    23.                   
    24.                 //后边的XXX.class就是要启动的服务    
    25.                 Intent service = new Intent(context,AutoStartService.class);    
    26.                 context.startService(service);    
    27.                   
    28.                 // 启动应用,参数为需要自动启动的应用的包名,只是启动app的activity的包名  
    29.                 Intent newIntent = context.getPackageManager()  
    30.                         .getLaunchIntentForPackage("com.example.autostart");  
    31.                 context.startActivity(newIntent);  
    32.             }  
    33.         }  
    34.     }  
    35.   
    36. }  
4.必须放到同一个包里



下面简单说下开机自启动失效问题

  1. 系统中没有注册receiver
    尽管这个问题几乎是不可能出现的,还是列出来吧,^_^
    在AndroidManifest.xml中注册receiver
    [html] view plaincopy
    1. <receiver android:name=".BootReceiver"  
    2.     android:label="@string/app_name">  
    3.     <intent-filter>  
    4.   
    5.         <action android:name="android.intent.action.BOOT_COMPLETED"/>  
    6.           
    7.     </intent-filter>  
    8. </receiver>  
  2. 没有Boot权限
    和上面一样,这个问题也是几乎不可能出现的
    添加权限
    [html] view plaincopy
    1. <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"></uses-permission>  
  3. 修改之后直接关闭模拟器,然后Run as ...
    Run as 是相当于先启动模拟器,然后再安装应用程序,虽然这种情况有时也会成功,但失败的情况也不少
    在测试这种开机启动的应用的时候不应该直接Run as...,应该在AVD中启动模拟器,如图

如下图所示

这个问题烦了我很久,有这种Android实现开机自启动无效的问题,不妨参考下这种方法


     4.  必须在intent中添加Intent.FLAG_ACTIVITY_NEW_TASK标记,

 newIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);  //注意,必须添加这个标记,否则启动会失败 

 newIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);也可以

     5.  BootReceiver .Java 要 和main activity放在一个包下!这就是我之前老是启动失败的原因

或者在注册BootReceiver 的时候,对命名的相应改动,如果有朋友知道,还请告知。

 

6.android3.1之前,安装完就可以自启动,android4.0的广播机制好像改了,就是一个应用如果安装到手机后没有被启动过的话是接收不到系统广播的,也就是说如果你想接收系统广播,那必须保证你的程序被运行过。我查到的资料说是广播机制增加了两个flag,默认情况下系统是不会给一个没有启动过的程序发送系统广播的。另外自启动成功后,下次卸载安装,还是会出现同样问题,但如果是覆盖安装,那么装完后,不需要运行,也能自启动


0 0
原创粉丝点击