gpt4 book ai didi

android - 取消从多任务面板中删除应用程序的通知

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

我管理来 self 的应用程序(而不是来自服务)的ONGOING通知。

当我使用“结束”按钮从任务管理器中终止应用程序时,通知消失

当我从多任务面板中删除应用程序时,应用程序被终止,但通知仍然存在

我的问题是:

  • 如何捕获此事件以清除通知?
  • 从多任务面板中删除应用程序后会发生什么?应用程序被销毁但进程仍然存在?正常吗?

作为更新:

我所有的 Activity 都使用方法扩展了 MyActivity 类(它扩展了 Activity):

@Override protected void onCreate(Bundle state) {
super.onCreate(state);
((MyApplication) getApplication()).onActivityCreate(this, state);
}

@Override protected void onDestroy() {
super.onDestroy();
((MyApplication) getApplication()).onActivityDestroy(this);
}

我的应用程序使用方法扩展了 MyApplication 类(它扩展了 Application):

private List<Activity> activities = new ArrayList<Activity>();

protected final void onActivityCreate(Activity activity, Bundle state) {
if(activities.isEmpty() && state == null) {
onStart();
}
activities.add(activity);
}

protected final void onActivityDestroy(Activity activity) {
activities.remove(activity);
if(activities.isEmpty() && activity.isFinishing()) {
onExit();
}
}

protected void onStart() {
// some code
}

protected void onExit() {
// some code
notificationManager.cancel(NOTIFICATION_ID);
}

activities 是所有正在运行的 Activity 的列表

这不是最简单的机制,但我需要它

我应该改用服务吗?


作为新的更新:

在我的 onExit() 方法中,如果我记录调试消息以了解会发生什么情况:

public void onExit() {
for(int i = 0; i < 100; i++) {
Log.d(TAG, "onExit");
}
}

少量日志在两个上出现一次,而不是全部(例如:13/100)

所以,我知道从多任务面板中删除应用程序会强制终止应用程序而无需等待关闭方法结束以正确完成...但是为什么不处理呢?!

如何强制正确终止?

最佳答案

在主应用程序被杀死时杀死通知。

由于您的通知和您的应用在不同的线程中处理,因此通过 MultitaskManager 终止您的应用不会终止您的通知。正如您已经正确调查过,杀死您的应用程序甚至不一定会导致 onExit() 回调。

那么解决方案是什么?

您可以从您的 Activity 中启动一项服务。特殊服务有:如果应用进程由于某种原因被杀死,它们会自动重启。因此,您可以通过在重启时终止通知来重用自动重启。

第 1 步创建杀死服务简单的一个。它只是杀死了创建通知并拥有他的特殊 Binder 。

public class KillNotificationsService extends Service {

public class KillBinder extends Binder {
public final Service service;

public KillBinder(Service service) {
this.service = service;
}

}

public static int NOTIFICATION_ID = 666;
private NotificationManager mNM;
private final IBinder mBinder = new KillBinder(this);

@Override
public IBinder onBind(Intent intent) {
return mBinder;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
return Service.START_STICKY;
}
@Override
public void onCreate() {
mNM = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
mNM.cancel(NOTIFICATION_ID);
}
}

第 2 步:将其添加到 list 中:将其添加到您的 标签之间。

<service android:name="KillNotificationsService"></service>

第 3 步:始终在触发通知之前创建服务,并使用静态通知 ID。

ServiceConnection mConnection = new ServiceConnection() {
public void onServiceConnected(ComponentName className,
IBinder binder) {
((KillBinder) binder).service.startService(new Intent(
MainActivity.this, KillNotificationsService.class));
Notification notification = new Notification(
R.drawable.ic_launcher, "Text",
System.currentTimeMillis());
Intent notificationIntent = new Intent(MainActivity.this,
Place.class);
PendingIntent contentIntent = PendingIntent.getActivity(
MainActivity.this, 0, notificationIntent, 0);
notification.setLatestEventInfo(getApplicationContext(),
"Text", "Text", contentIntent);
NotificationManager mNM = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
mNM.notify(KillNotificationsService.NOTIFICATION_ID,
notification);
}

public void onServiceDisconnected(ComponentName className) {
}

};
bindService(new Intent(MainActivity.this,
KillNotificationsService.class), mConnection,
Context.BIND_AUTO_CREATE);

重新启动服务可能需要一点时间(1-5 秒),但它最终会启动并终止通知。

关于android - 取消从多任务面板中删除应用程序的通知,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12997800/

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