//这是有问题的代码,多关闭打开几次就会报如下异常/**

09-18 10:47:21.225 8617-8617/derlinp.com.appsearch E/InputEventSender﹕ Exception dispatching finished signal.
09-18 10:47:21.225 8617-8617/derlinp.com.appsearch E/MessageQueue-JNI﹕ Exception in MessageQueue callback: handleReceiveCallback
09-18 10:47:21.235 8617-8617/derlinp.com.appsearch E/MessageQueue-JNI﹕ java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
at android.support.v4.app.FragmentManagerImpl.checkStateLoss(FragmentManager.java:1377)
at android.support.v4.app.FragmentManagerImpl.popBackStackImmediate(FragmentManager.java:504)
at android.support.v4.app.FragmentActivity.onBackPressed(FragmentActivity.java:178)
at android.app.Activity.onKeyUp(Activity.java:2204)
at android.view.KeyEvent.dispatch(KeyEvent.java:2694)
at android.app.Activity.dispatchKeyEvent(Activity.java:2447)
at android.support.v7.internal.view.WindowCallbackWrapper.dispatchKeyEvent(WindowCallbackWrapper.java:49)
at android.support.v7.app.AppCompatDelegateImplBase$AppCompatWindowCallbackBase.dispatchKeyEvent(AppCompatDelegateImplBase.java:258)
at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchKeyEvent(PhoneWindow.java:1977)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1408)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1408)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1408)
at android.widget.TabHost.dispatchKeyEvent(TabHost.java:324)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1408)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1408)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1408)
at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchKeyEvent(PhoneWindow.java:2050)
at com.android.internal.policy.impl.PhoneWindow.superDispatchKeyEvent(PhoneWindow.java:1514)
at android.app.Activity.dispatchKeyEvent(Activity.java:2442)
at derlinp.com.appsearch.activity.MainActivity.dispatchKeyEvent(MainActivity.java:98)
at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchKeyEvent(PhoneWindow.java:1977)
at android.view.ViewRootImpl$ViewPostImeInputStage.processKeyEvent(ViewRootImpl.java:3963)
at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:3937)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3404)
at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3454)
at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3423)
at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3530)
at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3431)
at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:3587)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3404)
at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3454)
at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3423)
at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3431)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3404)
at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3454)
at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3423)
at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3563)
at android.view.ViewRootImpl$ImeInputStage.onFinishedInputEvent(ViewRootImpl.java:3726)
at android.view.inputmethod.InputMethodManager$PendingEvent.run(InputMethodManager.java:2028)
at android.view.inputmethod.InputMethodManager.invokeFinishedInputEventCallback(InputMethodManager.java:1722)
at android.view.inputmethod.InputMethodManager.finishedInputEvent(InputMethodManager.java:1713)
at android.view.inputmethod.InputMethodManager$ImeInputEventSender.onInputEventFinished(InputMethodManager.java:2005)
at android.view.InputEventSender.dispatchInputEventFinished(InputEventSender.java:141)
at android.os.MessageQueue.nativePollOnce(Native Method)
at android.os.MessageQueue.next(MessageQueue.java:138)
at android.os.Looper.loop(Looper.java:123)
at android.app.ActivityThread.main(ActivityThread.java:5111)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:797)
at com.android.internal.os.ZygoteInit.main(Zyg
09-18 10:47:21.245 8617-8617/derlinp.com.appsearch E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: derlinp.com.appsearch, PID: 8617
java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
at android.support.v4.app.FragmentManagerImpl.checkStateLoss(FragmentManager.java:1377)
at android.support.v4.app.FragmentManagerImpl.popBackStackImmediate(FragmentManager.java:504)
at android.support.v4.app.FragmentActivity.onBackPressed(FragmentActivity.java:178)
at android.app.Activity.onKeyUp(Activity.java:2204)
at android.view.KeyEvent.dispatch(KeyEvent.java:2694)
at android.app.Activity.dispatchKeyEvent(Activity.java:2447)
at android.support.v7.internal.view.WindowCallbackWrapper.dispatchKeyEvent(WindowCallbackWrapper.java:49)
at android.support.v7.app.AppCompatDelegateImplBase$AppCompatWindowCallbackBase.dispatchKeyEvent(AppCompatDelegateImplBase.java:258)
at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchKeyEvent(PhoneWindow.java:1977)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1408)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1408)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1408)
at android.widget.TabHost.dispatchKeyEvent(TabHost.java:324)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1408)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1408)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1408)
at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchKeyEvent(PhoneWindow.java:2050)
at com.android.internal.policy.impl.PhoneWindow.superDispatchKeyEvent(PhoneWindow.java:1514)
at android.app.Activity.dispatchKeyEvent(Activity.java:2442)
at derlinp.com.appsearch.activity.MainActivity.dispatchKeyEvent(MainActivity.java:98)
at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchKeyEvent(PhoneWindow.java:1977)
at android.view.ViewRootImpl$ViewPostImeInputStage.processKeyEvent(ViewRootImpl.java:3963)
at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:3937)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3404)
at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3454)
at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3423)
at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3530)
at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3431)
at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:3587)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3404)
at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3454)
at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3423)
at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3431)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3404)
at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3454)
at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3423)
at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3563)
at android.view.ViewRootImpl$ImeInputStage.onFinishedInputEvent(ViewRootImpl.java:3726)
at android.view.inputmethod.InputMethodManager$PendingEvent.run(InputMethodManager.java:2028)
at android.view.inputmethod.InputMethodManager.invokeFinishedInputEventCallback(InputMethodManager.java:1722)
at android.view.inputmethod.InputMethodManager.finishedInputEvent(InputMethodManager.java:1713)
at android.view.inputmethod.InputMethodManager$ImeInputEventSender.onInputEventFinished(InputMethodManager.java:2005)
at android.view.InputEventSender.dispatchInputEventFinished(InputEventSender.java:141)
at android.os.MessageQueue.nativePollOnce(Native Method)
at android.os.MessageQueue.next(MessageQueue.java:138)
at android.os.Looper.loop(Looper.java:123)
at android.app.ActivityThread.main(ActivityThread.java:5111)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(Zygote

*///意思就是说在某个Activity被系统销毁的时候系统框架调用onSaveInstanceState方法后还执行程序就会报IllegalStateException异常,这本就是android本身的问题,在这里我刚好试到一种方法可以避免这个异常,就在执行跳转命令后返回false,不往下传,返回事件就在这里终止。就没有再报错,还有一种解决方案就是在TabActivity下的每个Activity分别重写onBackPressed()来切换到后台。这样写不会报之前的异常,只是同样的代码要写几遍,很烦

最开始的代码 1   public boolean dispatchKeyEvent(KeyEvent event) {
 2         if (event.getAction() == KeyEvent.ACTION_DOWN
 3                 && event.getKeyCode() == KeyEvent.KEYCODE_BACK) {
 4                 ResolveInfo launcherResolve=queryCurrentLauncher();
 5                 Intent intent=new Intent();
 6                 intent.addCategory(Intent.ACTION_MAIN);
 7                 ComponentName componentName=new ComponentName(launcherResolve.activityInfo.packageName,launcherResolve.activityInfo.name);
 8                 intent.setComponent(componentName);
 9                 startActivitySafely(intent);
10             Toast.makeText(this, "要开始切换了", Toast.LENGTH_SHORT).show();
11
12         }
13         return super.dispatchKeyEvent(event);
14     }
15     private void startActivitySafely(Intent intent){
16         try{
17             startActivity(intent);
18             Toast.makeText(this, "切换到后台成功", Toast.LENGTH_SHORT).show();
19         }catch (Exception e){
20             Toast.makeText(this, "切换到后台失败", Toast.LENGTH_SHORT).show();
21             e.printStackTrace();
22         }
23     }
24
25     private ResolveInfo queryCurrentLauncher() {
26         Intent launcherIntent = new Intent(Intent.ACTION_MAIN);
27         launcherIntent.addCategory(Intent.CATEGORY_HOME);
28         launcherIntent.addCategory(Intent.CATEGORY_DEFAULT);
29         List<ResolveInfo> launcherInfoList = getPackageManager().queryIntentActivities(launcherIntent, PackageManager.MATCH_DEFAULT_ONLY);
30
31         ResolveInfo launcherResolveInfo = null;
32         ActivityManager activityManager = (ActivityManager) getSystemService(Service.ACTIVITY_SERVICE);
33         List<ActivityManager.RunningTaskInfo> tasks = activityManager.getRunningTasks(30);
34         Iterator<ActivityManager.RunningTaskInfo> itInfo = tasks.iterator();
35         while (itInfo.hasNext()) {
36             ActivityManager.RunningTaskInfo info = itInfo.next();
37             for (ResolveInfo resolveInfo : launcherInfoList) {
38                 String name1 = info.topActivity.getClassName();
39                 String namme2 = resolveInfo.activityInfo.name;
40                 if (name1.equals(namme2)) {
41                     //获取当前使用的桌面
42                     launcherResolveInfo = resolveInfo;
43                     return launcherResolveInfo;44                 }
45             }
46         }
47         return launcherResolveInfo;
48     }

修改后的代码
    public boolean dispatchKeyEvent(KeyEvent event) {if (event.getAction() == KeyEvent.ACTION_DOWN&& event.getKeyCode() == KeyEvent.KEYCODE_BACK) {ResolveInfo launcherResolve=queryCurrentLauncher();Intent intent=new Intent();intent.addCategory(Intent.ACTION_MAIN);ComponentName componentName=new ComponentName(launcherResolve.activityInfo.packageName,launcherResolve.activityInfo.name);intent.setComponent(componentName);startActivitySafely(intent);Toast.makeText(this, "要开始切换了", Toast.LENGTH_SHORT).show();return false;}return super.dispatchKeyEvent(event);}private void startActivitySafely(Intent intent){try{startActivity(intent);Toast.makeText(this, "切换到后台成功", Toast.LENGTH_SHORT).show();}catch (Exception e){Toast.makeText(this, "切换到后台失败", Toast.LENGTH_SHORT).show();e.printStackTrace();}}private ResolveInfo queryCurrentLauncher() {Intent launcherIntent = new Intent(Intent.ACTION_MAIN);launcherIntent.addCategory(Intent.CATEGORY_HOME);launcherIntent.addCategory(Intent.CATEGORY_DEFAULT);List<ResolveInfo> launcherInfoList = getPackageManager().queryIntentActivities(launcherIntent, PackageManager.MATCH_DEFAULT_ONLY);ResolveInfo launcherResolveInfo = null;ActivityManager activityManager = (ActivityManager) getSystemService(Service.ACTIVITY_SERVICE);List<ActivityManager.RunningTaskInfo> tasks = activityManager.getRunningTasks(30);Iterator<ActivityManager.RunningTaskInfo> itInfo = tasks.iterator();while (itInfo.hasNext()) {ActivityManager.RunningTaskInfo info = itInfo.next();for (ResolveInfo resolveInfo : launcherInfoList) {String name1 = info.topActivity.getClassName();String namme2 = resolveInfo.activityInfo.name;if (name1.equals(namme2)) {//获取当前使用的桌面launcherResolveInfo = resolveInfo;return launcherResolveInfo;}}}return launcherResolveInfo;}

这样就避免了再TabActivity下的每个Activity中分别写切换到后台的代码。

转载于:https://www.cnblogs.com/xushihai/p/4818608.html

TabActivity 切换到后台遇到的问题相关推荐

  1. java 切换后台程序_将 Android 程序切换到后台及从后台切换到前台实现

    将 Android 程序切换到后台及从后台切换到前台实现 有时候, 我们需要将自己的 Android 程序切换到后台运行, 在必要时, 将其切换到前台运行下面提供了一种实现方式, 首先需要引用三个单元 ...

  2. 绑定bindchange事件的微信小程序swiper闪烁,抖动问题解决,(将微信小程序切换到后台一段时间,再打开微信小程序,会出现疯狂循环轮播,造成抖动现象)

    绑定bindchange事件的微信小程序swiper闪烁,抖动问题解决,(将微信小程序切换到后台一段时间,再打开微信小程序,会出现疯狂循环轮播,造成抖动现象) 参考文章: (1)绑定bindchang ...

  3. h5 监听浏览器被切换到后台或者手机锁屏再次唤起事件

    H5有一个事件叫 visibilitychange ,当浏览器的某个标签页切换到后台,或从后台切换到前台时就会触发该消息,代码如下: document.addEventListener("v ...

  4. APP切换到后台时的运行规则以及如何实现后台运行

    正常情况下,使用应用时,当用户按下home键,APP便被挂起(线程和runloop都会暂时挂起),但是依然驻留在内存中,这种状态下,如果不使用苹果允许的那几种一直在后台运行的方法(如播放音乐.定位等) ...

  5. Android监听应用切换到后台和前台

    一个是注册监听: @HiltAndroidApp class MyApplication :Application{constructor() : super()override fun onCrea ...

  6. app切换到后台一分钟后锁定,需要输入手势密码才能打开(程序锁)

    #app切换到后台一分钟后锁定,需要输入手势密码才能打开(程序锁) 解锁规则: 未设置解锁密码,则什么都不用输入即可进入应用 1分钟内再次回到应用,无需输入密码.手势密码等即可进入 超过1分钟后回到应 ...

  7. Android app切到后台 返回首页,Android 如何保证App切换到后台,或页面跳转后,重新打开APP、或返回之前页面时,维持其状态不变...

    项目中遇到的一些小问题,记录.分享一下. Android 如何保证App切换到后台,或页面跳转后,重新打开APP.或返回之前页面时,维持其页面状态不变? 1.问:当APP启动后,打开某一界面,然后点击 ...

  8. android程序按home切换到后台,点击launcher的图标切换到前台,当前页面退出回到启动页

       问题:  在一次app测试中,偶然发现打开项目按下home键,回到桌面,再次点击app图标,进入app,切换之前的页面突然退出,回到了首页,开始以为是该页面出现bug崩溃了,查看日志,并未发现错 ...

  9. android 杀死程序收不到推送_Android APP切换到后台接收不到推送消息

    1.   Android端进程被杀死后,目前自带的保护后台接收消息活跃机制.暂时没有什么好的机制保持任何情况下都活跃 android原生系统用home键杀进程可以起来,如果是强行停止就只能用户自己手动 ...

最新文章

  1. C#DataGrdviewl加入checkBox全选删除
  2. 面试 | MySQL InnoDB一棵B+树可以存放多少行数据?
  3. Linux协议栈(7)——网络层实现
  4. cass批量选目标快捷键_大神总结100个CAD快捷键+20个CAD制图技巧,值得收藏!
  5. pytorch 中的 @ 和 * 运算符
  6. GDCM:gdcm::ImageHelper的测试程序
  7. 每天一道LeetCode-----计算给定序列中所有长度为k的滑动窗的最大值集合
  8. How to use external classes and PHP files in Laravel Controller?
  9. .Net/C#分库分表高性能O(1)瀑布流分页
  10. Codeforces Round #724 (Div. 2) F. Omkar and Akmar 组合数学 + 博弈
  11. Spring / Hibernate应用程序的性能调优
  12. 数据库查询语句慢如何优化_常见Mysql的慢查询优化方式
  13. HDU-1754 线段树的节点更新,储存区间的最大值
  14. bcp导入到数据库_Bcp和链接到Azure的服务器
  15. mysql5.5.17源代码安装
  16. 第三次小组实践作业小组每日进度汇报:2017-12-2
  17. systemtap的一些总结
  18. android adb 环境变量配置,Windows如何配置Android的ADB环境变量
  19. 怎么用电脑操控自己的手机 怎样用电脑控制手机?
  20. 丰桥自助打印顺丰面单

热门文章

  1. ThreadLocal相关
  2. Android UI布局之LinearLayout
  3. C语言中的结构体,联合,链表和枚举,位域(上)
  4. Sqlldr使用介绍
  5. DLA实现跨地域、跨实例的多AnalyticDB读写访问
  6. linux 安装 memcached
  7. JS的for循环小例子
  8. Bootstrap 3 Typeahead
  9. Citrix桌面及应用虚拟化系列之三:活动目录架构准备
  10. 《Oracle Database 12c DBA指南》第二章 - 安装Oracle和创建数据库(2.2 安装数据库软件)...