3

我的问题是。

在 Android 中有一种方法可以创建一个服务,即使您重新启动手机也可以保持活动状态,直到它不执行其任务,

例如报警应用。如果您重新启动手机,它将被触发而没有任何问题。

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

请详细解释。

4

4 回答 4

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

于 2012-10-26T14:23:11.840 回答
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处理警报响铃的广播在哪里。

于 2012-10-26T14:24:36.527 回答
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))
    {
                 //...
    }
}

}
于 2012-10-26T14:21:48.280 回答
0

在 Android 中有一种方法可以创建一个服务,即使您重新启动手机也可以保持活动状态,直到它不执行其任务,

不,如果我们从字面上解释您的请求。当您重新启动设备时,所有进程都将终止,就像您关闭设备时所有进程都将终止一样。

例如报警应用。如果您重新启动手机,它将被触发而没有任何问题。

这是因为“警报应用程序”在启动时通过 获得控制权ACTION_BOOT_COMPLETED BroadcastReceiver,并使用 重新安排警报AlarmManager

类似地,实现下载队列的服务将在启动时通过 获得控制权,ACTION_BOOT_COMPLETED BroadcastReceiver此时它将确定还需要下载什么并返回该工作。

于 2012-10-26T14:23:17.620 回答