gpt4 book ai didi

android - 即使应用程序从最近的应用程序中清除,也继续服务

转载 作者:IT王子 更新时间:2023-10-28 23:42:25 27 4
gpt4 key购买 nike

我有一个小问题。

在我的应用程序中,用户成功登录后会启动一个服务。以前,如果应用程序被终止,服务需要停止。 (比如说,通过滑动从最近的应用程序列表中删除。)所以我们使用了 android:stopWithTask="true"。现在我们需要服务按原样运行,即使启动它的任务已从最近的应用程序列表中删除。所以我更改了服务以包含 android:stopWithTask="false"。但这似乎不起作用。

相关代码:

这里是与Service相关的manifest部分:

<service
android:enabled="true"
android:name=".MyService"
android:exported="false"
android:stopWithTask="false" />

在 MyService.java 中:

public class MyService extends AbstractService {

@Override
public void onStartService() {
Intent intent = new Intent(this, MyActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, 0);
Notification notification = new Notification(R.drawable.ic_launcher, "My network services", System.currentTimeMillis());
notification.setLatestEventInfo(this, "AppName", "Message", pendingIntent);
startForeground(MY_NOTIFICATION_ID, notification);
}

@Override
public void onTaskRemoved(Intent rootIntent) {
Toast.makeText(getApplicationContext(), "onTaskRemoved called", Toast.LENGTH_LONG).show();
System.out.println("onTaskRemoved called");
super.onTaskRemoved(rootIntent);
}
}

AbstractService.java 是扩展Sevrice的自定义类:

public abstract class AbstractService extends Service {

protected final String TAG = this.getClass().getName();

@Override
public void onCreate() {
super.onCreate();
onStartService();
Log.i(TAG, "onCreate(): Service Started.");
}

@Override
public final int onStartCommand(Intent intent, int flags, int startId) {
Log.i(TAG, "onStarCommand(): Received id " + startId + ": " + intent);
return START_STICKY; // run until explicitly stopped.
}

@Override
public final IBinder onBind(Intent intent) {
return m_messenger.getBinder();
}

@Override
public void onDestroy() {
super.onDestroy();
onStopService();
Log.i(TAG, "Service Stopped.");
}

public abstract void onStartService();
public abstract void onStopService();
public abstract void onReceiveMessage(Message msg);

@Override
public void onTaskRemoved(Intent rootIntent) {
Toast.makeText(getApplicationContext(), "AS onTaskRemoved called", Toast.LENGTH_LONG).show();
super.onTaskRemoved(rootIntent);
}
}

现在,如果我登录应用程序,MyService 就会启动。之后我按下主页按钮,所以应用程序被移到后台。现在我从最近的应用程序列表中删除该应用程序。那时,我应该看到 Toast 和控制台消息,按照这个方法的描述:

public void onTaskRemoved (Intent rootIntent)

Added in API level 14

This is called if the service is currently running and the user has removed a task that comes from the service's application. If you have set ServiceInfo.FLAG_STOP_WITH_TASK then you will not receive this callback; instead, the service will simply be stopped.

Parameters rootIntent The original root Intent that was used to launch the task that is being removed.

但我没有看到任何这些。服务在 onStartCommand 中返回 START_STICKY,所以我认为 onTaskRemoved 应该与标志 android:stopWithTask="false" 一起被触发。

我错过了什么吗?

如果我需要添加一些可能对找出问题很重要的代码,请告诉我。

P.S.:到目前为止,我在 4.2.2 上对此进行了测试。

P.S.:我刚刚在 4.1.2 中测试了相同的代码,Service 在该代码上继续运行,并且我也在日志中收到“onTaskRemoved called”消息。

我应该怎么做才能在所有版本中都能正常工作?

最佳答案

只要遵循这些场景,您的服务和流程(线程在您的服务内部运行)将保持连续。

  1. 创建服务并在 onStartCommand 方法中使用 START_STICKY 作为返回值,如下所示:

    @Override
    public int onStartCommand(final Intent intent,
    final int flags,
    final int startId) {

    //your code
    return START_STICKY;
    }
  2. 如果您的应用程序从最近的应用程序中删除,上述代码将在被破坏并始终保持运行时重新启动服务,但从服务运行的进程(线程)将停止工作。为确保您的进程(线程)始终处于运行状态,您必须重写 onTaskRemoved() 方法并添加代码以重新启动任务,如下所示。

    @Override
    public void onTaskRemoved(Intent rootIntent){
    Intent restartServiceTask = new Intent(getApplicationContext(),this.getClass());
    restartServiceTask.setPackage(getPackageName());
    PendingIntent restartPendingIntent =PendingIntent.getService(getApplicationContext(), 1,restartServiceTask, PendingIntent.FLAG_ONE_SHOT);
    AlarmManager myAlarmService = (AlarmManager) getApplicationContext().getSystemService(Context.ALARM_SERVICE);
    myAlarmService.set(
    AlarmManager.ELAPSED_REALTIME,
    SystemClock.elapsedRealtime() + 1000,
    restartPendingIntent);

    super.onTaskRemoved(rootIntent);
    }
  3. 像下面这样启动服务

startService(new Intent(this, YourService.class));

关于android - 即使应用程序从最近的应用程序中清除,也继续服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26842675/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com