安卓服务的生命周期

3

我的问题是。

在Android中,是否有一种方法可以创建一个服务,即使您重新启动手机,它也可以保持活动状态,直到完成其任务为止?

例如,闹钟应用程序。如果您重新启动手机,它将被触发而无任何问题。

在Android中,所有服务都是这样的吗?还是我们有其他解决方案?

请详细说明。


开机时会发送广播。 - njzk2
4个回答

2

需要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) 现在像这样在清单中声明此接收器:

    <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


您还需要在清单文件中添加<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />。 - Edward Falk
哦,技术上讲,这会启动一个BroadcastReceiver而不是服务。BroadcastReceiver需要构造一个Intent来启动实际的服务。 - Edward Falk
问题仍然存在,我已经发布了一个新帖子来描述我的问题。http://stackoverflow.com/questions/13094926/android-services-life-time-continuation - abidkhan303

2

有没有一种方法可以创建一个服务,即使您重新启动手机,它也能保持活动状态

没有。关闭手机时,所有正在运行的服务都会被终止。

例如闹钟应用程序。如果您重新启动手机,它将被触发而不会出现任何问题。

是的,但这不是因为服务保持活动状态。而是因为闹钟应用程序响应了android.intent.action.BOOT_COMPLETED意图。

您可以创建一个BoradcastReceiver来响应此意图并启动您的服务。

问题在于用户可以手动终止此服务。如果要构建闹钟,则不应始终在后台运行服务。

您应该利用AlarmManagerPendingIntent

类似于您的清单中的内容:

<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 是负责处理闹铃的广播。


问题仍然存在,我已经发布了一个新帖子来描述我的问题。http://stackoverflow.com/questions/13094926/android-services-life-time-continuation - abidkhan303

0

请查看服务文档。您需要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))
    {
                 //...
    }
}

}

1
这并不包括“重新启动手机”。 - CommonsWare
我马上就到那一部分了 :) - Jarrod Smith
http://stackoverflow.com/questions/13094926/android-services-life-time-continuation - abidkhan303

0
在Android中,有没有一种方法可以创建一个服务,即使您重新启动手机,它也可以保持活动状态,直到完成其任务?
如果我们按照您的请求字面意思来解释,那么答案是否定的。当您关闭设备时,所有进程都会终止,就像您重新启动设备时一样。
例如,闹钟应用程序。如果您重新启动手机,它将被触发而不会出现任何问题。
这是因为“闹钟应用程序”在引导时通过ACTION_BOOT_COMPLETED BroadcastReceiver获得控制,并使用AlarmManager重新安排其闹钟。
同样,实现下载队列的服务将通过ACTION_BOOT_COMPLETED BroadcastReceiver在引导时获得控制,在此时它将确定仍需要下载什么并返回到该工作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接