Android 如何从用户长按(关闭)电源按钮的位置恢复我的活动
我正在开发应用程序,我有一个要求:如果用户在任何时候长按电源按钮,然后再次按下启动设备,活动应该从设备关闭的位置开始。我不知道这是否是一个有效的问题。 我试着与:Android 如何从用户长按(关闭)电源按钮的位置恢复我的活动,android,Android,我正在开发应用程序,我有一个要求:如果用户在任何时候长按电源按钮,然后再次按下启动设备,活动应该从设备关闭的位置开始。我不知道这是否是一个有效的问题。 我试着与: public class PowerMangerTestActivity extends Activity { private static PowerManager objpowermanager; private static PowerManager.WakeLock wl; /** Called when the acti
public class PowerMangerTestActivity extends Activity {
private static PowerManager objpowermanager;
private static PowerManager.WakeLock wl;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
callTOWakeLock();
setContentView(R.layout.main);
}//end of onCreate
public void callTOWakeLock() {
// TODO Auto-generated method stub
objpowermanager=(PowerManager)getSystemService(Context.POWER_SERVICE);
wl=objpowermanager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "******MyTag****");
//You should acquire it when your app starts,
if(wl.isHeld())
{
wl.release();
}
wl.acquire();
}
@Override
public void onDestroy() {
wl.release();
}
@Override
protected void onStop() {
// TODO Auto-generated method stub
super.onStop();
}
@Override
protected void onResume() {
// TODO Auto-generated method stub
super.onResume();
callTOWakeLock();
}
/*@Override
public boolean dispatchKeyEvent(KeyEvent event) {
if (event.getKeyCode() == KeyEvent.KEYCODE_POWER) {
Intent i = new Intent(this, PowerMangerTestActivity.class);
startActivity(i);
return true;
TextView tv=(TextView) findViewById(R.id.textview);
tv.setText("You press power button");
}
return super.dispatchKeyEvent(event);
}*/
}
但没有得到预期的行为。我试图捕获
KeyEvent.KEYCODE\u POWER
,但没有获得如何用于此场景。
有什么建议吗?
谢谢这可能是您无法接受的,但您不应该这样做 这违背了一个叫做“预期行为”的可用性理念 你正在做一些用户不期望的事情,如果你这样做,他们很可能会生气 就我的两分钱 我会尝试找到解决这个问题的另一种方法,比如在手机存储器中缓存有用的数据,并在应用程序恢复/启动时调用这些数据
长按电源按钮时,应调用onPause still。据我所知,唯一一种不会调用的情况是电池拔出紧急管理器应用程序捕捉电源按钮事件是合理的,因此这里有一个解决方案,取自三星支持数据库: 软件包com.samsung.lockscreenreceiver
public class LockScreenReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
final String action = intent.getAction();
if(Intent.ACTION_USER_PRESENT.equals(action)) {
// bring app to foreground
} else if(Intent.ACTION_SCREEN_OFF.equals(action) ) {
Toast.makeText(context, "screen on",Toast.LENGTH_LONG).show();
} else if (Intent.ACTION_SCREEN_ON.equals(action)) {
Toast.makeText(context, "screen off",Toast.LENGTH_LONG).show();
}
}
}
以及活动:
公共类MyActivity扩展了活动{
private BroadcastReceiver mReceiver;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mReceiver = new LockScreenReceiver();
IntentFilter intentFilter = new IntentFilter();
intentFilter.setPriority(IntentFilter.SYSTEM_HIGH_PRIORITY);
intentFilter.addAction(Intent.ACTION_USER_PRESENT);
intentFilter.addAction(Intent.ACTION_SCREEN_OFF);
intentFilter.addAction(Intent.ACTION_SCREEN_ON);
//intentFilter.addAction(Intent.ACTION_SHUTDOWN); // won't work unless you're the device vendor
registerReceiver(mReceiver, intentFilter);
}
@Override
protected void onDestroy()
{
super.onDestroy();
unregisterReceiver(mReceiver);
}
}
您接通/断开电源,并将活动带到前台。然后,该活动使用以下方法拒绝所有焦点更改:
@Override
public void onWindowFocusChanged(boolean hasFocus) {
//super.onWindowFocusChanged(hasFocus);
if(!hasFocus) {
Intent closeDialog = new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
sendBroadcast(closeDialog);
}
}
您必须关闭屏幕锁定,例如使用:
上述应用不受保护,因此您可以像往常一样对其进行反编译。:) 这可能是您无法接受的,但您不应该这样做。这违背了一个叫做“预期行为”的可用性理念。你正在做一些用户不期望的事情,如果你这样做,他们很可能会生气。就我的两分钱!我会尝试找到解决这个问题的另一种方法,例如在手机存储器中缓存有用的数据,并在应用程序恢复/启动时调用这些数据。@Pheonixblade9感谢您的回复!我可以在power button long press button事件中使用共享首选项吗?还有,如何将应用程序的状态保存在shared pref(在onPause/onDestroy中)中,以及如何在onCreate/onResume中检索活动。这是一种更好的方法。长按电源按钮时,应调用onPause still。(据我所知)唯一不会调用的情况是电池拉电。@Pheonixblade9+1(据我所知)唯一不会调用的情况是电池拉电。我会将此作为答案重新发布,以便您可以接受并关闭问题:)