我想在特定情况下仅在某个活动不可见时在我的应用中启动通知。
当我创建并销毁Activity(使用onCreate / onDestroy)时,我设法做了服务的绑定/取消绑定,如果通过onPause / onResume方法可以看到此活动,则保存在布尔值中,如下面的代码所示所示:
public void onCreate(Bundle savedInstanceState) {
// ...
bindService(...);
}
public void onDestroy() {
// ...
unbindService(mConnection);
}
public void onResume() {
// ...
// this method sets to true the Service's boolean which retain Activity's visibility.
mService.registerActivity(true);
}
public void onPause() {
mService.registerActivity(false);
}
在服务上,我检查此布尔值以启动通知。
它适用于除特定情况之外的所有情况:在此活动中打开应用程序但启用了锁定屏幕时。
通过我做过的一些测试,当锁定屏幕出现时,调用Activity.onPause方法。我希望锁定屏幕解锁后才调用Activity.onResume方法,但事实并非如此。当我按下电源按钮来召唤锁定屏幕时,已经调用了Activity.onResume方法。从这个意义上说,我所做的是不对的。
如何仅在用户解锁锁定屏幕时才调用Activity.onResume方法?或者......如何确定锁定屏幕已解锁且用户真正查看活动?
答案 0 :(得分:5)
Activity.onWindowFocusChanged(boolean hasFocus)
在屏幕解锁后重新获得焦点时, Activity
都会返回true。
答案 1 :(得分:0)
2个想法,没有经过考验,我仍然是一个机器人noob:
ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
List<RunningAppProcessInfo> list2 = am.getRunningAppProcesses();
然后,从此列表中过滤您的活动,并检查它的重要性属性。正面运行的应用程序是100,当锁屏在它前面时,不知道它是否仍然是100。
或者,您可以创建一个正在运行的进程,如果屏幕被锁定,则会检查x秒,并在再次解锁时执行某些操作。