Don*_*rty 193 android back-button nullpointerexception onkeypress android-activity
我目前有一个活动,当它显示时,通知也将显示在通知栏中.
这样,当用户按下主页并将活动推送到后台时,他们可以通过通知返回活动.
当用户按下后退按钮时,问题就出现了,我的活动被破坏但是通知仍然存在,因为我希望用户能够按下但仍然能够通过通知进入活动.但是当用户尝试这个时,我会尝试Null Pointers尝试启动一项新活动,而不是重新启动旧活动.
所以基本上我希望Back按钮的行为与Home按钮完全相同,这是我到目前为止的尝试方式:
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (Integer.parseInt(android.os.Build.VERSION.SDK) < 5
&& keyCode == KeyEvent.KEYCODE_BACK
&& event.getRepeatCount() == 0) {
Log.d("CDA", "onKeyDown Called");
onBackPressed();
}
return super.onKeyDown(keyCode, event);
}
public void onBackPressed() {
Log.d("CDA", "onBackPressed Called");
Intent setIntent = new Intent(Intent.ACTION_MAIN);
setIntent.addCategory(Intent.CATEGORY_HOME);
setIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(setIntent);
return;
}
Run Code Online (Sandbox Code Playgroud)
但是上面的代码似乎仍然允许我的Activity被销毁,如何在按下后退按钮时阻止我的Activity被销毁?
eka*_*was 262
删除您的密钥监听器或true在您拥有时返回KEY_BACK.
你只需要以下赶返回键(确保不叫超中onBackPressed()).
此外,如果您计划在后台运行服务,请务必查看startForeground()并确保持续通知,否则如果需要释放内存,Android将终止您的服务.
@Override
public void onBackPressed() {
Log.d("CDA", "onBackPressed Called");
Intent setIntent = new Intent(Intent.ACTION_MAIN);
setIntent.addCategory(Intent.CATEGORY_HOME);
setIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(setIntent);
}
Run Code Online (Sandbox Code Playgroud)
Teo*_*nke 68
只用一行代码就可以更容易地实现它:
@Override
public void onBackPressed() {
moveTaskToBack(true);
}
Run Code Online (Sandbox Code Playgroud)
kis*_*swa 12
我认为你想要的不是覆盖后退按钮(这似乎不是一个好主意 - Android操作系统定义了这种行为,为什么要更改它?),但要使用活动生命周期并将设置/数据保留在onSaveInstanceState(Bundle)事件.
@Override
onSaveInstanceState(Bundle frozenState) {
frozenState.putSerializable("object_key",
someSerializableClassYouWantToPersist);
// etc. until you have everything important stored in the bundle
}
Run Code Online (Sandbox Code Playgroud)
然后使用onCreate(Bundle)从该持久化bundle中获取所有内容并重新创建状态.
@Override
onCreate(Bundle savedInstanceState) {
if(savedInstanceState!=null){ //It could be null if starting the app.
mCustomObject = savedInstanceState.getSerializable("object_key");
}
// etc. until you have reloaded everything you stored
}
Run Code Online (Sandbox Code Playgroud)
考虑上面的伪代码,指出你正确的方向.阅读活动生命周期应该可以帮助您确定实现所需内容的最佳方式.
and*_*-BD 11
干脆做这个..
@Override
public void onBackPressed() {
//super.onBackPressed();
}
Run Code Online (Sandbox Code Playgroud)
注释掉//super.onBackPressed(); 会做的
小智 6
尝试这个:
@Override
public void onBackPressed() {
finish();
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
323660 次 |
| 最近记录: |