让Android点击通知栏信息后返回正在运行的程序,并完全退出所有activity

时间:2022-08-30 14:14:39

最近发现开发中的应用在home键关闭后,从通知栏重新打开后无法用退出按钮关闭应用,在网上查了n久后,发现一些关键的原因,还没实中践测试,先做下笔记。

    首先,其中一个原因可能是从通知栏打开应用是新开activity并且是存在一个新的task堆里的,这种情况下使用restartpackage()方法不能关闭应用的所有activity,解决的办法可以强制从通知栏打开应用时回来原activity或者能关闭所有task里的 activity

      方法二试过,不过不知如何取出所有activity,task也不知如何清除。方法一现在想想应该推荐这种方法,找到的方法资料先贴上:

 

如果要实现点击通知图标返回已经运行的程序,贴出关键的部分代码。

public void shownotification(String msg)
{
NotificationManager barmanager
=(NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);
Notification notice
= new Notification(android.R.drawable.stat_notify_chat,"服务器发来信息了",System.currentTimeMillis());
notice.flags
=Notification.FLAG_AUTO_CANCEL;
Intent appIntent
= new Intent(Intent.ACTION_MAIN);
//appIntent.setAction(Intent.ACTION_MAIN);
appIntent.addCategory(Intent.CATEGORY_LAUNCHER);
appIntent.setComponent(
new ComponentName(this.getPackageName(), this.getPackageName() + "." + this.getLocalClassName()));
appIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
| Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);//关键的一步,设置启动模式
PendingIntent contentIntent =PendingIntent.getActivity(this, 0,appIntent,0);
notice.setLatestEventInfo(
this,"通知","信息:"+msg, contentIntent);
barmanager.notify(STATUS_BAR_ID,notice);

}
通过上面的代码你可以实现上面的功能了

但是另一位博主实现这个的时候有一个问题,我没有测试过
她说
((( 在真测试时会遇到一个问题:当你安装包在手机上安装时(不是连接在电脑上用Run As运行的), 安装完成后点击 【打开】按钮进入程序后,再点击通知栏上的图标,就会导致运行一个新的Activity,而且原来运行的Activity也在运行。
这种问题只会出现在第一次安装后立即运行时,但是覆盖安装并不会有这样的情况。我也还找不到办法解决,如果有朋友解决了 分享下。)))
不知道这个问题怎么解决
有网友说“再加一个模式吧。Intent.FLAG_ACTIVITY_CLEAR_TOP“,我没有测试过
不知道可行否

 

另外这里可能也要设置一下比较好:

这里需要在配置文件中设置每个Activity以单任务运行,否则,每次返回原Activity时会新增加一个Activity,而不会返回到原Activity。



  在使用FLAG_ACTIVITY_NEW_TASK控制标识时也会出现不会返回到原Activity的现象。如果该标识使一个Activity开始了一个新的Task,然后当用户按了HOME键离开这个Activity,在用户按下BACK键时将无法再返回到原Activity。一些应用(例如Notification)总是在一个新的Task里打开Activity,而从来不在自己的Task中打开,所以它们总是将包含FLAG_ACTIVITY_NEW_TASK的Intent传递给startActivity()。所以如果有一个可以被其他的东西以这个控制标志调用的Activity,请注意让应用程序有独立的回到原Activity的方法。 代码如下:

<activity android:name="ShowMessageActivity"
android:launchMode
="singleTask"></activity>


  这里需要注意的是:

  
<activity>下的launchMode属性可以设置四种启动方式:

standard (默认模式)
singleTop
singleTask
singleInstance

更详细看原博文是http://www.cnblogs.com/hanyonglu/archive/2012/04/15/2450551.html

先贴上,明天实践测试后贴上实际实现方法。

 在网上找来找去,找到的文章好像说的挺难的样子,以上的方法经测试是没用的,然后我仔细翻了各flag标记,发现这条Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY让我眼前一亮,不过经过测试我也不清楚管不管用,因为我的需求并不是为了显示它,而是因为我的应用在关闭时遇到了问题:关闭后重新打开还会进入历史activity上。

  其实如果没有特别的需要,什么flag都不加也可以,我的需求是因为程序有退出按钮,要将应用完全退出,也是挺麻烦的,经过多种方法n次测试发现在api level8以下只能用activityManager.restartPackage(packname)关闭,在android4.x系统发现这种方法不行,官方文档也已抛弃这个方法改成actManager.killBackgroundProcesses,不过如果你想兼容各版本,就不能用这个方法了,后来我想用home键功能返回主界面,方法:

Intent intent = new Intent(Intent.ACTION_MAIN);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
|Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET); //这是我加的,我以为这样可以清掉所有历史activity
ntent.addCategory(Intent.CATEGORY_HOME);
startActivity(intent);
finish();

测试的结果却是:从通知栏打开应用后这种退出方法并不能退出所有历史activity,所以从通知栏打开应用可以说它也是新建了task的,而Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET也没有起到我想的作用,或者说它只清了当前的task,因为当我把通知栏打开的activity设为android:launchMode="singleTask"(AndroidManifest.xml上)时,退出后它似乎清除了所有activity,就是说通知栏打开应用时它没有新建task了?反正功能是达到了我的需求,看来貌似通知栏打开应用会默认新建task的流程是不能改的,只能改它打开的activity的特性