日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

TabActivity 切换到后台遇到的问题

發布時間:2024/4/15 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 TabActivity 切换到后台遇到的问题 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

//這是有問題的代碼,多關閉打開幾次就會報如下異常
/**

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 切换到后台遇到的问题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。