Android 在后台释放主活动

Android 在后台释放主活动,android,activity-lifecycle,application-lifecycle,Android,Activity Lifecycle,Application Lifecycle,每次应用程序进入后台,RAM开始填充,应用程序开始释放变量(如果我没有错,这是Android的正常行为,它会释放变量实例) 当我从后台带回应用程序时,应用程序会崩溃,因为我失去了主活动 如果根本没有活动,有没有办法重新启动此活动? 是一个模棱两可的问题,但我发现这个问题,但我不认为是最好的选择 ActivityManager mngr = (ActivityManager) getSystemService( ACTIVITY_SERVICE ); List<ActivityManage

每次应用程序进入后台,RAM开始填充,应用程序开始释放变量(如果我没有错,这是Android的正常行为,它会释放变量实例)

当我从后台带回应用程序时,应用程序会崩溃,因为我失去了主活动

如果根本没有活动,有没有办法重新启动此活动? 是一个模棱两可的问题,但我发现这个问题,但我不认为是最好的选择

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");
}
这是应用程序中的日志

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) 

我不确定你的应用程序是否因为失去了MainActivity而崩溃,你应该使用@pablobu建议的onSaveInstanceState编写代码,期待这种行为,这是正确的方法

我们能看看日志吗?如果您正在丢失实例的状态,那么很好,您应该保存这些状态并恢复它们,是因为片段吗?你也可以保存这些,这是一个很好的阅读

请,你能给我们你的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();
    }
}

我不确定你的应用程序是否因为失去了MainActivity而崩溃,你应该使用@pablobu建议的onSaveInstanceState编写代码,期待这种行为,这是正确的方法

我们能看看日志吗?如果您正在丢失实例的状态,那么很好,您应该保存这些状态并恢复它们,是因为片段吗?你也可以保存这些,这是一个很好的阅读

请,你能给我们你的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();
    }
}

您可以使用捆绑包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”设置为“Baum” (NullPointerException,因为没有指向“Key”的字符串)。
稍后,当活动将被销毁时,将调用onSaveInstanceState。在这里,您可以将变量(aVariable)保存在一个键(“键”)下。

您可以使用Bundle savedinStatEstate,它在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”设置为“Baum” (NullPointerException,因为没有指向“Key”的字符串)。
稍后,当活动将被销毁时,将调用onSaveInstanceState。在这里,您可以将变量(aVariable)保存在一个键(“键”)下。

看起来您根本不需要检查是否没有活动,只需要在从内存中删除活动之前存储活动状态,然后恢复到该状态。在这里检查onSaveInstanceState和onRestoreInstanceState或onCreate,但我可以用完整的活动来完成吗@PABLOBUW什么是完整活动?我会更新我的问题。通过更新,检查onAttach首先执行的片段生命周期,而不是onActivityCreated(),因此尝试在onActivityCreated()上执行此操作。看起来你根本不需要检查是否没有活动,只需要在将活动状态从内存中删除之前存储它,然后恢复到该状态。在这里检查onSaveInstanceState和onRestoreInstanceState或onCreate,但我可以用完整的活动来完成吗@PABLOBUW什么是完全活动?我会更新我的问题。好吧,通过更新,检查onAttach首先执行的片段生命周期,而不是onActivityCreated(),所以尝试在onActivityCreated()上执行。哦,对不起,它可能会重复第一个答案中的内容。哦,对不起,它可能会重复第一个答案中的内容。