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(据我所知)唯一不会调用的情况是电池拉电。我会将此作为答案重新发布,以便您可以接受并关闭问题:)