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