1

在我的代码中,我试图了解设备锁定时启动的意图。

例如:假设我的活动正在运行,并且我按下电源按钮来锁定手机。INTENT.ACTION_SCREEN_OFF 启动。活动暂停,屏幕变为空白。

所以我想要的是每当设备被用户锁定时,我不想完成我的活动,但是如果用户按下主页按钮或后退按钮,我正在完成活动。因此,为此我编写了一个代码,但它不起作用。

我用过的代码

public void onResume()
{
    super.onResume();
    m_ScreenLocked = false;

    // Intent and receiver to listen to screen lock
    m_IntentFilter = new IntentFilter(Intent.ACTION_SCREEN_ON);
    m_IntentFilter.addAction(Intent.ACTION_SCREEN_OFF);
    m_BroadcastReceiver = new ScreenStateBroadcastReceiver();
    registerReceiver(m_BroadcastReceiver, m_IntentFilter);
}

private final class ScreenStateBroadcastReceiver extends BroadcastReceiver 
{
    @Override
    public void onReceive(final Context context, final Intent intent) 
    {
         if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) 
         {
            m_ScreenLocked = true;
         } 
         else if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) 
         {
             //other stuff
         }
    }
}

@Override
public void onStop()
{
    super.onStop();
    m_NoteManagerObject.setPageViewRunning(false);

    if (!m_ScreenLocked)
    {
         unregisterReceiver(m_BroadcastReceiver);
         finish();
     }
     else
     {
         unregisterReceiver(m_BroadcastReceiver);
     }
}
4

1 回答 1

1

当您在活动中以编程方式注册接收器时,当您的活动暂停时它不会得到广播。这里的文档很模糊,因为它们只是“建议”取消注册onPause(),但不要说当您的活动暂停时接收器将无法工作。

然而,真正的问题是你为什么要这样做。作为用户,如果我在使用您的应用程序时屏幕关闭,并且当我解锁屏幕时,应用程序消失了,我会很生气。请记住,您无法区分用户按下电源按钮和屏幕只是超时。

无论如何,一个可能的解决方法是注册您的活动以在您的清单中接收这些操作。这不一定有效,因为并非所有意图都可以在清单意图过滤器中注册。如果我记得,不能在您的清单中注册 ACTION_SCREEN_* 意图。

另一种方法是在与您的活动一起运行的服务中侦听这些意图,然后能够向您的活动发送不同的意图以告诉它自己完成。

于 2012-09-12T05:02:31.383 回答