Android-由于权限被禁用,应用程序被操作系统强制关闭后,应用程序在重新启动时崩溃

Android-由于权限被禁用,应用程序被操作系统强制关闭后,应用程序在重新启动时崩溃,android,android-fragments,android-fragmentactivity,android-lifecycle,Android,Android Fragments,Android Fragmentactivity,Android Lifecycle,产生问题的步骤 1) Launch Tasks.class activity 2) Hit home button puting the app in the background 3) Go to Settings->permissions and disable a permission which results in my app being force closed by the OS 4) Open app from launcher ---> app resumes T

产生问题的步骤

1) Launch Tasks.class activity
2) Hit home button puting the app in the background
3) Go to Settings->permissions and disable a permission which results in my app being force closed by the OS
4) Open app from launcher ---> app resumes Tasks.class activity instead of opening MainActivity --> CRASH
它在
listView.setAdapter(mAdapter)崩溃因为listView现在和所有类变量一样为空;这是我的活动。它使用TasksFragment类作为数据保持器来处理方向更改。创建TasksFragment后,它开始使用AsyncTask加载数据,并在使用回调获取新数据时通知活动

public class Tasks extends FragmentActivity  implements TasksFragment.TaskCallbacks{

   TasksFragment f;
   FragmentManager fm;
   String TASKS_TAG="TASKS";
   searchList = new ArrayList<Task>();
   TaskAdapter mAdapter;
   ListView listView;

   @Override
   protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_tasks);
      .
      .
      .
      fm = getSupportFragmentManager();
      f = (TasksFragment) fm.findFragmentByTag(TASKS_TAG);
      if (f == null) {
          f = new TasksFragment();
          fm.beginTransaction().add(f, TASKS_TAG).commit();
      }
      else{
          preLoad();
          postLoad();
      } 

   }

   @Override        //TaskFragmentCallback
   public void onPreExecute() { 
       preLoad(); 
   }

   @Override        //TaskFragmentCallback
   public void onProgressUpdate(Task task) {
       searchList.add(task);
       mAdapter.notifyDataSetChanged(); 
   }

   @Override        //TaskFragmentCallback
   public void onCancelled() { }

   @Override       //TaskFragmentCallback
   public void onPostExecute() { 
       postLoad(); 
   }

   public void preLoad(){
       searchList = new ArrayList<Task>();
       mAdapter = new TaskAdapter(this,searchList,true); 
       listView.setAdapter(mAdapter);
   }

   public void postLoad(){
       searchList.clear();
       searchList.addAll(f.taskList);
       mAdapter.notifyDataSetChanged(); 
   } 
}
我使用日志语句来确定事件的顺序,并看到了以下内容:

首次应用程序启动和启动任务.class

ON ACTIVITY CREATE 
ON FRAGMENT CREATE 
on pre execute callback
preload called by callback   
ON ACTIVITY RESUME
在Tasks.class打开且应用程序置于后台时,应用程序终止后重新打开

ON FRAGMENT CREATE
on pre execute callback //this is where it would crash
ON ACTIVITY CREATE
preload called by activity because fragment!=null  
ON ACTIVITY RESUME

我不明白为什么这个片段是在活动之前创建的…谁调用了这个要创建的片段?虽然
if(listView!=null)
条件解决了我的问题,但我认为这是一个绷带,不是真正的解决方案。有人能在这个问题上提供一些智慧吗?

我认为正在发生的事情(如果我错了,有人纠正我)是因为你在用
系统人工关闭应用程序。退出(0)
在Android中不是推荐的做法(据我所知),你的片段没有被完全分离。这将导致在您打开应用程序备份时恢复片段


如果(listView!=null)
有效,那么您正在执行的检查
,因为您的片段有点像幽灵。它仍然存在,但未附加到活动,因此无法获取对您尝试使用的ListView的引用。如果(this.getActivity()!=null)
,则类似但更“有效”的检查可能是

来自android系统文档

导致VM停止运行,程序以给定的退出状态退出如果runFinalizersOnExit(布尔值)以前使用真参数调用过则所有对象都将被正确地垃圾收集并首先完成。


我不确定这会有什么不同。通常我从不退出()android程序。

我没有使用System.exit(0)。我刚才提到这一点是为了简化问题。发生的情况是,我在“设置”中访问了我的应用程序的权限并取消了权限。这会导致android关闭应用程序,就像System.exit(0)关闭一样。这是一个用户可以轻松做到的事情,我希望不会导致崩溃。我将对问题进行编辑以避免进一步混淆它还说runFinalizersOnExit(布尔值)已被弃用且不安全。所以我想我不能用这个
ON FRAGMENT CREATE
on pre execute callback //this is where it would crash
ON ACTIVITY CREATE
preload called by activity because fragment!=null  
ON ACTIVITY RESUME