关于我想要制作的Android代码,我遇到了一些麻烦。我想要做的只是打印出1,如果用户想要解锁他们的手机,并且当程序首次启动时,打印出0,当用户按下屏幕锁定以锁定他们的手机时。我认为这与Android生命周期有关,所以我尝试使用onPause和onResume,但我的程序只打印出0,而不是1。 logTime方法只打印出1或0,MainActivity中的onCreate方法调用onResume()一次。这是我的代码:
MainActivity:
protected void onPause(){
if(ScreenReceiver.screenOn){
logTime(ScreenReceiver.screenOn);
super.onPause();
}
protected void onResume()
if(!ScreenReceiver.screenOn){
logTime(!ScreenReceiver.screenOn);
super.onResume();
}
屏幕接收器:
public class ScreenReceiver extends BroadcastReceiver{
public static boolean screenOn;
@Override
public void onReceive(Context context, Intent intent){
if(intent.getAction().equals(Intent.ACTION_SCREEN_OFF)){
screenOn = false;
}
else if(intent.getAction().equals(Intent.ACTION_SCREEN_ON)){
screenOn = true;
}
}
}
我不确定为什么它只打印出0。可能有人知道为什么?谢谢!
答案 0 :(得分:0)
根据您的代码,一切似乎都是正确的,它应该始终打印0 ...
当屏幕关闭时,screenOn
设置为false
,您的活动onPause
被调用,它会打印0。
当您的应用程序正在运行且onResume
被调用时,screenOn
将为true
(无论屏幕是否刚打开),在那里,您记录的是{{ 1}},所以再次为0 ......
答案 1 :(得分:0)
您的活动onPause()
与收到的实际广播之间存在延迟,因此通常您可以获得“奇数”(错误)读数,因为变量未发生变化。此接收器需要动态注册,即使屏幕关闭并重新打开,您也希望它能够接收。通常,接收器在onPause()中未注册以避免泄漏,但在这里,我们将使用onDestroy()
,因为这是我们可以使用的最后一个方法调用。为简单起见,我在活动中设置了BroadcastReceiver
并直接调用了logTime()
。
示例代码:
public class MainActivity extends Activity {
BroadcastReceiver receiver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_ON);
filter.addAction(Intent.ACTION_SCREEN_OFF);
receiver = new BroadcastReceiver(){
@Override
public void onReceive(Context arg0, Intent arg1) {
if(arg1.getAction().equals(Intent.ACTION_SCREEN_OFF)){
logTime(false);
}
else if(arg1.getAction().equals(Intent.ACTION_SCREEN_ON)){
logTime(true);
}
}
};
registerReceiver(receiver, filter);
}
@Override
protected void onDestroy()
{
try{
unregisterReceiver (receiver);
}
catch (NullPointerException e){
e.printStackTrace();
}
catch (IllegalStateException e1){
e.printStackTrace();
}
super.onDestroy();
}
public void logTime (boolean screen)
{
Time now = new Time();
now.setToNow();
String lsNow = now.format("%m-%d-%Y %I:%M:%S");
TextView myText = (TextView) findViewById (R.id.myText);
myText.append (" " + lsNow + (screen ? "0" : "1"));
}
}