在Android4.0之前,服务是可以在开机时自动运行的,但是在Android4.0以后,为了安全起见,防止一些非法的后台服务在开机后自动运行,用户必须打开一个Activity后才可以启动服务。
那么我们想想,如果我们不是做一些非法的操作是否可以有其他的变通方法解决这个问题呢。
如果是要更新桌面小组件的数据,那么我们可以在小组件服务创建时启动数据更新服务,如下:
1 2 3 4 5 6 7 8 9 |
public class NoteWidgetService extends RemoteViewsService { @Override public void onCreate() { Intent intent = new Intent(getApplicationContext(), CloudNoteService.class); getApplicationContext().startService(intent); super.onCreate(); } } |
*
Android4.0之前设置服务开机自启动的方法
首先AndroidManifest.xml中加入
1 |
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> |
创建用于接收RECEIVE_BOOT_COMPLETED广播的BroadcastReceiver类
1 2 3 4 5 6 7 8 9 10 |
public class NoteBootReceiver extends BroadcastReceiver { @Override public void onReceive(Context arg0, Intent arg1) { Intent servicentent = new Intent(arg0, CloudNoteService.class); arg0.startService(servicentent); } } |
在AndroidManifest.xml中声明这个receiver类
1 2 3 4 5 6 7 8 9 10 11 12 |
<receiver android:name="com.jeoe.cloudnote.NoteBootReceiver" android:enabled="true" android:exported="true" android:permission="android.permission.RECEIVE_BOOT_COMPLETED" > <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED" /> <action android:name="android.intent.action.QUICKBOOT_POWERON" /> <action android:name="android.intent.action.ACTION_EXTERNAL_APPLICATIONS_AVAILABLE" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </receiver> |
BOOT_COMPLETED:当系统启动完成时发送这个广播
QUICKBOOT_POWERON:HTC的一些手机有快速启动,这个action是针对快速启动情况的
ACTION_EXTERNAL_APPLICATIONS_AVAILABLE:这个action是针对程序安装到sd卡的时候,sd卡上的应用加载完成时发送此广播