如何从用户长按(关闭)电源按钮的位置恢复我的活动

时间:2011-11-08 15:53:56

标签: android

我正在处理该应用程序,我有这样的要求:如果用户长按电源按钮并再按一次启动设备,活动应该从设备关闭的地方开始。我不知道这个是一个有效的问题。 我尝试过:

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_POWER,但没有得到如何使用这种情况。 有什么建议? 感谢

2 个答案:

答案 0 :(得分:2)

这对您来说可能是不可接受的,但您不应该这样做。

这违背了一种称为“预期行为”的可用性概念。

你正在做一些用户并不期望的事情,如果你这样做,他们很可能会生气。

只是我的两分钱!

我会尝试找到解决此问题的另一种方法,例如在手机存储中缓存有用数据,并在恢复/启动应用程序时调用它。

长按电源按钮时仍应调用

onPause。唯一一个(据我所知)不会被调用的情况是电池拉动

答案 1 :(得分:0)

紧急经理应用程序捕获电源按钮事件是合理的,所以这是一个解决方案,取自三星支持数据库:

package 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扩展了Activity {

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);
    }
}

您必须关闭屏幕锁定,例如使用:

https://play.google.com/store/apps/details?id=org.jraf.android.nolock&hl=en

以上应用不受保护,因此您可以照常反编译。 :)