要实现后台长时间运行,我们一般会开一个服务,并在服务中运行一个不断循环的线程。我们在清单文件中注册的服务,一般都是应用开启时得以运行。但当用户重新开机后未启动我们的应用时,服务就不会运行。这时我们就要想个办法避免这种情况,最能想到的当然是开机重启服务,下面是一些实现过程:
清单文件:
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<!-- receiver BOOT_COMPLETED -->
<receiver
android:name="包.receiver.RemindReceiver"
android:enabled="true" >
<intent-filter android:priority="1000" >
<action android:name="android.intent.action.BOOT_COMPLETED"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
<meta-data
android:name="msg"
android:value="@string/boot"/>
</receiver>
广播:
public class RemindReceiver extends BroadcastReceiver {
private static final String TAG = "BootReceiver";
@Override
public void onReceive(Context context, Intent intent) {
//logcat查看
ComponentName cn = new ComponentName(context, RemindService.class);
try {
ActivityInfo info = context.getPackageManager().getReceiverInfo(cn, PackageManager.GET_META_DATA);
Log.i(TAG, info.metaData.getString("msg"));
} catch (NameNotFoundException e) {
//打印异常
Log.e(TAG,RemindReceiver.class.getSimpleName() + ":" + e.getMessage());
}
//主要任务
Intent serviceIntent = new Intent(context, RemindService.class);
context.startService(serviceIntent);
}
}
服务:
public class RemindService extends Service {
private static final String TAG = "RemindService";
Timer timer;
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onCreate() {
super.onCreate();
timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
//执行任务
}
}, 60 * 1000, 60 * 1000);
}
@Override
public void onDestroy() {
super.onDestroy();
timer.cancel();
Log.i(TAG, "RemindService is destroy");
}
}
清单中注册服务:
<!-- Remind Service -->
<service
android:name="包.RemindService"
android:enabled="true"
android:exported="false" >
</service>