Android 如何检测我的应用程序是否从应用程序切换器中刷卡?

Android 如何检测我的应用程序是否从应用程序切换器中刷卡?,android,service,android-mediaplayer,Android,Service,Android Mediaplayer,我的Android音频播放器应用程序在播放时设置绑定服务,以确保它不会被系统杀死。应用程序使用系统媒体播放器。该服务在系统栏中创建通知图标 当我从“最近使用的应用程序”列表中滑动应用程序时,该应用程序将消失。但是:媒体播放器将继续播放,通知将保留在系统栏中 当我选择通知或应用程序图标时,它会启动应用程序的新实例,无法访问正在运行的实例。只能通过在应用程序的系统设置中选择强制停止来停止。如果我不从列表中滑动应用程序,我总是返回到播放实例 如果我的应用程序能够检测到它何时被从列表中删除,它就能正确地

我的Android音频播放器应用程序在播放时设置绑定服务,以确保它不会被系统杀死。应用程序使用系统媒体播放器。该服务在系统栏中创建通知图标

当我从“最近使用的应用程序”列表中滑动应用程序时,该应用程序将消失。但是:媒体播放器将继续播放,通知将保留在系统栏中

当我选择通知或应用程序图标时,它会启动应用程序的新实例,无法访问正在运行的实例。只能通过在应用程序的系统设置中选择强制停止来停止。如果我不从列表中滑动应用程序,我总是返回到播放实例

如果我的应用程序能够检测到它何时被从列表中删除,它就能正确地停止一切。但是onDestroy()不能保证被调用,例如在CM12中也不能。onStop()或onPause()对我来说不是vadlid,因为当应用程序刚刚进入后台时,音频不应该停止

那么,如何检测应用程序何时从列表中被刷走呢

这就是服务。这里能做点什么吗

public class myService extends Service {
...

@Override
public void onCreate() {
    mNM = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);
    showNotification();
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    return START_STICKY;
}

@Override
public void onDestroy() {
    mNM.cancel(NOTIFICATION);
    stopForeground(true);
}

@Override
public IBinder onBind(Intent intent) {
    return mBinder;
}
...

private void showNotification() {
    Notification notification = new Notification(R.drawable.icon, "Hello", 0);
    Intent intent = new Intent(this, myActivity.class);
    intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
    PendingIntent pendIntent = PendingIntent.getActivity(this, 0, intent, 0);
    notification.setLatestEventInfo(this, "AppName", "Hello", pendIntent);
    notification.flags |= Notification.FLAG_NO_CLEAR;
    startForeground(FOREGROUNDID, notification);
    }
}
以下是我的服务的绑定方式:

private static ServiceConnection mConnection = new ServiceConnection() {
    public void onServiceConnected(ComponentName className, IBinder service) {
          // Not used
    }

    public void onServiceDisconnected(ComponentName className) {
          // Not used
    }
};

private static void doBindService() {
    context.bindService(
        new Intent(context, myService.class),
        mConnection, Context.BIND_AUTO_CREATE);
}

感谢您的帮助。

服务有一个在此场景中触发的方法。您可以在那里停止服务:

/**
 * 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 ServiceInfo.FLAG_STOP_WITH_TASK}
 * then you will not receive this callback; instead, the service will simply
 * be stopped.
 *
 * @param rootIntent The original root Intent that was used to launch
 *                   the task that is being removed.
 */
@Override
public void onTaskRemoved(Intent rootIntent) {
    super.onTaskRemoved(rootIntent);

    stopSelf();
}

请记住从
onStop()
onDestroy()中的
活动中解除
服务的绑定。(与您的绑定策略一致的任何内容。)

服务有一个在此场景中触发的方法。您可以在那里停止服务:

/**
 * 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 ServiceInfo.FLAG_STOP_WITH_TASK}
 * then you will not receive this callback; instead, the service will simply
 * be stopped.
 *
 * @param rootIntent The original root Intent that was used to launch
 *                   the task that is being removed.
 */
@Override
public void onTaskRemoved(Intent rootIntent) {
    super.onTaskRemoved(rootIntent);

    stopSelf();
}

请记住从
onStop()
onDestroy()中的
活动中解除
服务的绑定。(与您的绑定策略一致的内容。)

Android无法启动同一应用程序的多个实例,那么“运行的实例无法访问”是什么意思?我在服务中没有看到媒体播放器,您希望活动不会被销毁吗?我希望活动、服务和媒体播放器会被销毁。随着媒体播放器继续播放,符号停留在系统栏中,我认为只有活动会被刷卡杀死,而服务不会。所以“运行实例”确实被错误地描述了。媒体播放器在活动中处理,该服务仅用于防止应用程序被系统杀死并显示符号。正如我在某处读到的,这是一个有效的程序。是的,这是一个有效的程序。但是在这种情况下,媒体播放器控制器应该在服务中,以便重新启动的活动可以连接到它并控制正在运行的播放。Android无法启动同一应用程序的多个实例,那么“无法访问正在运行的实例”是什么意思?我在服务中没有看到媒体播放器,您希望活动不会被销毁吗?我希望活动、服务和媒体播放器会被销毁。随着媒体播放器继续播放,符号停留在系统栏中,我认为只有活动会被刷卡杀死,而服务不会。所以“运行实例”确实被错误地描述了。媒体播放器在活动中处理,该服务仅用于防止应用程序被系统杀死并显示符号。正如我在某处读到的,这是一个有效的程序。是的,这是一个有效的程序。但是在这种情况下,媒体播放器控制器应该在服务中,以便重新启动的活动可以连接到它并控制正在运行的播放。这听起来很奇怪,但没有做任何更改,它可以按预期工作。我试图按照您的建议添加onTaskRemoved,但出现@Override错误。我还尝试了清单中服务的“android:stopWithTask”开关,这在我的2.2环境中也不起作用。现在,我看不出与以前版本的代码有什么不同,但滑动会停止媒体播放器和服务。这听起来很奇怪,但没有做任何更改,它会按预期工作。我试图按照您的建议添加onTaskRemoved,但出现@Override错误。我还尝试了清单中服务的“android:stopWithTask”开关,这在我的2.2环境中也不起作用。现在,我看不出与以前版本的代码有什么不同,但滑动会停止媒体播放器和服务。