zoukankan      html  css  js  c++  java
  • 让Android点击通知栏信息后返回正在运行的程序,并完全退出所有activity

    最近发现开发中的应用在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的特性

  • 相关阅读:
    MaaS系统概述
    流处理认识
    事务补偿
    Hystrix原理与实战
    RPC概念和框架
    git remote: error: hook declined to update
    Unity CombineTexture
    Windows Powershell统计代码行数
    unity面试题二
    unity面试题一
  • 原文地址:https://www.cnblogs.com/easywebfactory/p/3058603.html
Copyright © 2011-2022 走看看