我的问题是。
在Android中有一种创建服务的方法,即使你重新启动手机也能保持活力,直到它不执行任务为止,
例如警报应用程序。如果您重新启动移动设备,它将被触发而没有任何问题。
在android中所有服务的行为都是这样的,还是我们有一些解决方案呢?
请详细解释。
答案 0 :(得分:2)
这将需要两个步骤:
(1)首先创建一个BroadcastReceiver并在此接收者的onReceive()方法中启动服务:
public class MyReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Intent service = new Intent(context, YourService.class);
context.startService(service);
}
}
(2)现在以这样的方式对这个接收器进行decalre:
<receiver android:name=".MyReceiver" >
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
这样,即使重新启动手机,您的服务也会一直在运行并启动。有关更多详细信息,请参阅以下链接:
http://www.vogella.com/articles/AndroidServices/article.html
答案 1 :(得分:2)
有没有办法创建一个即使你可以保持活力的服务 重启手机
没有。关闭手机时,所有正在运行的服务都将被终止。
例如警报应用程序。如果您重新启动手机,它将是 触发没有任何问题。
是的,但这不是因为服务还活着。这是因为闹钟应用响应android.intent.action.BOOT_COMPLETED
意图。
您可以做的是创建一个响应此意图并启动您的服务的BoradcastReceiver。
问题是用户可以手动终止此服务。如果您想构建一个闹钟,您应该不让服务始终在后台运行。
您应该使用AlarmManager和PendingIntent。
你的清单中的东西:
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<receiver
android:name=".broadcasts.InitReceiver"
android:exported="false" >
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
<action android:name="android.intent.action.TIME_SET" />
<action android:name="android.intent.action.TIMEZONE_CHANGED" />
</intent-filter>
</receiver>
这样的广播节目。
public class InitReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// Schedule your alarms again.
}
}
你应该安排这样的警报:
Intent intent = new Intent(context, Ring.class);
intent.setData(alarmUri);
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT);
AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
alarmManager.set(AlarmManager.RTC_WAKEUP, ringTime, pendingIntent );
Ring
是处理警报响铃的广播。
答案 2 :(得分:0)
查看Services documentation。您需要START_STICKY标志,如果由于内存不足等而终止服务,系统将重新启动您的服务。
处理设备重启...
<强>清单强>
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<service
android:name=".BootService"
android:label="Boot Service" >
<intent-filter>
<action android:name="com.my.package.BootService" />
</intent-filter>
</service>
<receiver
android:name=".receiver.BootReceiver"
android:enabled="true"
android:exported="true"
android:label="Boot Receiver" >
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
<强>来源
public class BootReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Log.d(this.getClass().getName(), "Boot Receiver onReceive()");
if ("android.intent.action.BOOT_COMPLETED".equals(intent.getAction()))
{
// Fire up your service.
Intent serviceIntent = new Intent("com.my.package.BootService");
serviceIntent.putExtra(Constants.BOOT_LAUNCH_EXTRA, true);
context.startService(serviceIntent);
}
}
}
public class BootService extends IntentService {
public BootService()
{
super("BootService");
}
@Override
protected void onHandleIntent(Intent intent) {
Log.d(this.getClass().getName(), "Boot Service onHandleIntent()");
if(intent.hasExtra(Constants.BOOT_LAUNCH_EXTRA))
{
//...
}
}
}
答案 3 :(得分:0)
在Android中有一种创建服务的方法,即使你重新启动手机也能保持活力,直到它不执行任务为止,
不,如果我们按字面解释您的请求。重新启动设备时会终止所有进程,就像关闭设备时所有进程都终止一样。
例如警报应用程序。如果您重新启动移动设备,它将毫无问题地被触发。
这是因为“警报应用程序”在启动时通过ACTION_BOOT_COMPLETED
BroadcastReceiver
获得控制权,并通过AlarmManager
重新安排其警报。
类似地,实现下载队列的服务将在引导时通过ACTION_BOOT_COMPLETED
BroadcastReceiver
获得控制权,此时它将确定需要下载的内容并返回到该工作。< / p>