我的问题是。
在 Android 中有一种方法可以创建一个服务,即使您重新启动手机也可以保持活动状态,直到它不执行其任务,
例如报警应用。如果您重新启动手机,它将被触发而没有任何问题。
在 android 所有服务的行为都是这样,还是我们有一些解决方案?
请详细解释。
这将需要两个步骤:
(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) 现在像这样在清单中标记这个接收器:
<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
有没有办法创建一个即使你重启手机也能保持活力的服务
不会。关闭手机时,所有正在运行的服务都会被终止。
例如报警应用。如果您重新启动手机,它将被触发而没有任何问题。
是的,但这并不是因为服务还活着。这是因为警报应用程序会响应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
处理警报响铃的广播在哪里。
查看服务文档。您需要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))
{
//...
}
}
}
在 Android 中有一种方法可以创建一个服务,即使您重新启动手机也可以保持活动状态,直到它不执行其任务,
不,如果我们从字面上解释您的请求。当您重新启动设备时,所有进程都将终止,就像您关闭设备时所有进程都将终止一样。
例如报警应用。如果您重新启动手机,它将被触发而没有任何问题。
这是因为“警报应用程序”在启动时通过 获得控制权ACTION_BOOT_COMPLETED
BroadcastReceiver
,并使用 重新安排警报AlarmManager
。
类似地,实现下载队列的服务将在启动时通过 获得控制权,ACTION_BOOT_COMPLETED
BroadcastReceiver
此时它将确定还需要下载什么并返回该工作。