2016-11-22 83 views
0

每次應用走在後臺,和RAM開始填寫,申請開始鬆動變量(如即時消息沒有錯,這就是Android的正常行爲,其寬鬆的變量的情況下)發生散MainActivity的背景

當我從後臺導迴應用程序時,應用程序崩潰,因爲我失去了MainActivity。

如果根本沒有活動,有重新啓動此活動的方法嗎? 是一個模糊的問題,但我發現這個問題,但我不認爲是最好的選擇

ActivityManager mngr = (ActivityManager) getSystemService(ACTIVITY_SERVICE); 

List<ActivityManager.RunningTaskInfo> taskList = mngr.getRunningTasks(10); 

if(taskList.get(0).numActivities == 1 && 
    taskList.get(0).topActivity.getClassName().equals(this.getClass().getName())) { 
    Log.i(TAG, "This is last activity in the stack"); 
} 

林失去了充分的活動,以及我可以得到活動

@Override 
public void onAttach(Activity activity) { 
    LocalNotification.registerReceiver(reloadReceiver, LocalNotification.RELOAD_CARTMG); 
    try { 
     mListener = (OnFragmentInteractionListener) activity; 
     MainActivity ma = (MainActivity)activity; //THIS IS LOOSE 
     ma.openMyList = false; 
     ma.openMyAddress = false; 
     ma.hideSearchButton(); 
    } catch (ClassCastException e) { 
     throw new ClassCastException(activity.toString() + " must implement OnFragmentInteractionListener"); 
    } 

    super.onAttach(activity); 
} 

這是日誌在應用程序中

com.XXXX.mg E/Uncaught Exception detected in thread {}: Unable to start activity ComponentInfo{com.XXXX.mg/com.XXXX.view.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'void com.XXXX.view.MainActivity.showShoppingCartIcon()' on a null object reference 
                 java.lang.RuntimeException: Unable to start activity ComponentInfo{com.XXXX.mg/com.XXXX.view.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'void com.XXXX.view.MainActivity.showShoppingCartIcon()' on a null object reference 
                  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2426) 
                  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2490) 
                  at android.app.ActivityThread.-wrap11(ActivityThread.java) 
                  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1354) 
                  at android.os.Handler.dispatchMessage(Handler.java:102) 
                  at android.os.Looper.loop(Looper.java:148) 
                  at android.app.ActivityThread.main(ActivityThread.java:5443) 
                  at java.lang.reflect.Method.invoke(Native Method) 
                  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:728) 
                  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618) 
                 Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void com.XXXX.view.MainActivity.showShoppingCartIcon()' on a null object reference 
                  at com.XXXX.view.shoppingCart.ShoppingCartFragment.onDetach(ShoppingCartFragment.java:411) 
                  at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1202) 
                  at android.support.v4.app.FragmentManagerImpl.removeFragment(FragmentManager.java:1349) 
                  at android.support.v4.app.BackStackRecord.popFromBackStack(BackStackRecord.java:915) 
                  at android.support.v4.app.FragmentManagerImpl.popBackStackState(FragmentManager.java:1722) 
                  at android.support.v4.app.FragmentManagerImpl$3.run(FragmentManager.java:593) 
                  at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1617) 
                  at android.support.v4.app.FragmentController.execPendingActions(FragmentController.java:339) 
                  at android.support.v4.app.FragmentActivity.onStart(FragmentActivity.java:602) 
                  at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1260) 
                  at android.app.Activity.performStart(Activity.java:6261) 
                  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2389) 
                  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2490)  
                  at android.app.ActivityThread.-wrap11(ActivityThread.java)  
                  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1354)  
                  at android.os.Handler.dispatchMessage(Handler.java:102)  
                  at android.os.Looper.loop(Looper.java:148)  
                  at android.app.ActivityThread.main(ActivityThread.java:5443)  
                  at java.lang.reflect.Method.invoke(Native Method)  
                  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:728)  
                  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)  
+0

看起來您不需要檢查是否根本沒有任何活動,只需將您的活動狀態存儲在內存中,然後恢復到該狀態即可。檢查onSaveInstanceState和onRestoreInstanceState或onCreate這裏https://developer.android.com/training/basics/activity-lifecycle/recreating.html – pablobu

+0

但我可以做一個完整的活動? @pablobu –

+0

你的全部活動是什麼意思? – pablobu

回答

2

我不知道,如果你的應用程序崩潰,只是因爲你失去了你的MainActivity,你應該編碼期待這種行爲,使用onSaveInstanceS像@pablobu這樣的tate建議是正確的做法。

我們可以看到日誌嗎?如果你失去了你的實例的狀態,那麼你應該保存這些狀態並恢復它們Recreating an Activity是因爲碎片?你也可以保存這些,Handling Fragments Tutorial這是一個很好的閱讀。

請問,你能給我們你的logcat輸出,這可能會幫助我們看到真正的事情。

編輯

有了您的logcat編輯,嘗試看看的片段生命週期,onAttach執行首次超過onActivityCreated(),所以如果你的活動已經破壞了,你onAttach方法會不會有你的活動,你應該等到你的活動重新創建

而且,你有你的

super.onAttach(activity); 

在你的代碼塊的末尾,把它放在你的代碼塊之前。

/** 
This method was deprecated in API level 23. 
Use onAttach(Context) instead. 
*/ 
@Override 
public void onAttach(Context context) { 
super.onAttach(context); 
MainActivity mainActivity; 
if (context instanceof Activity) { 
    mainActivity = (MainActivity) context; 
    try { 
     mListener = (OnFragmentInteractionListener) mainActivity; 
     /** 
     Since you are getting a reference and accesing attributes you should be careful 
     with NullPointerException, check if not null first. 
     Or better yet refactor a little your code using an interface to handle this behaviour or use 
     the one you already created and just tell the activity what to do. 

     */ 
     /*if(mainActivity != null) { 
      ma.openMyList = false; 
      ma.openMyAddress = false; 
      ma.hideSearchButton(); 
     }*/ 

    } catch (ClassCastException e) { 
     throw new  ClassCastException(mainActivity.getClass().getSimpleName() + " must implement OnFragmentInteractionListener"); 
    } 
} 
} 

@Override 
public void onActivityCreated(Bundle savedInstanceState) { 
super.onActivityCreated(savedInstanceState); 
//since your Listener is global use mListener behaviour that I suggested here. 
if (mListener != null){ 
     mListener.openListOfSomething(false); 
     mListener.hideSearch(); 
    } 
} 
0

您可以使用捆綁savedInstatceState,至極在OnCreate中給出類似的方法:

private String aVariable; 

@Override 
public void onCreate (Bundle savedInstantceState) { 
    super.onCreate(savedInstanceState); 
    // Get the variable from savedInstanceState, if it isn't empty. 
    // If it is empty, it could be the first Activity run. 
    try { 
     aVariable = savedInstanceState.get("Key"); 
    } catch (NullPointerException e) { 
     aVariable = "Baum"; 
    } 
} 

@Override 
public void onSaveInstanceState(Bundle outState){ 
    super.onSaveInstanceState(outState); 
    outState.putString(aVariable, "Key"); 
} 

這些方法設置在第一次運行 變量「aVariable」到「鮑姆」(NullPointerException異常,因爲沒有字符串「鑰匙」)。 稍後,當Activity將被銷燬時,onSaveInstanceState將被調用。您可以在Key(「Key」)下保存變量(aVariable)。

+0

哦,我很抱歉,它可能會重複第一個答案。 –

相關問題