android服务的生命时间

时间:2012-10-26 14:11:11

标签: android service lifetime

我的问题是。

在Android中有一种创建服务的方法,即使你重新启动手机也能保持活力,直到它不执行任务为止,

例如警报应用程序。如果您重新启动移动设备,它将被触发而没有任何问题。

在android中所有服务的行为都是这样的,还是我们有一些解决方案呢?

请详细解释。

4 个答案:

答案 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。

问题是用户可以手动终止此服务。如果您想构建一个闹钟,您应该让服务始终在后台运行。

您应该使用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是处理警报响铃的广播。

答案 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>