1

在我的Android应用程序中,我每天在预定义的时间触发预定义的通知,以查找用户的输入。我正在使用powerManager类课&获取唤醒锁。我能够做到这一点,但我的要求是,如果用户正在主动用他/她的设备做某事,我的通知应该等待如何让我的android应用程序等待isInteractive()方法有效返回false?

我尝试过使用powerManager类提供的isInteractive()方法(代码如下),操作系统有时会抛出ANR(应用程序无响应),它有时会跳过通知。

我创建了一个新线程,只是为了让我的应用程序等待,直到设备未被使用,然后我打电话给我的通知发射部分。

Public class myClass extends BroadcastReceiver{ 

    private void checkPhoneUsage(Context context, int alarmId){ 
     final PowerManager pm = (PowerManager)context.getSystemService(Context.POWER_SERVICE); 
     mThread = new Thread(new Runnable() { 
         @Override 
         public void run() { 
          try{ 
           if(Build.VERSION.SDK_INT >= 20) 
            while(pm.isInteractive()) 
             Thread.sleep(10000); 
           else if (Build.VERSION.SDK_INT < 20) 
            while (pm.isScreenOn()) 
             Thread.sleep(10000); 
           // Call the method which fires Notification. 
           // fireNotification(alarmId); 
          } 
          catch (Exception e){ 
           Log.e(Tag,"Error during thread.sleep"); 
          } 
         } 
        }); 
     } 
    } 

我尝试使用SystemClock.wait(ms)但问题又来了重复,也失败,因为它不应该在UI线程中使用。

+0

你不能像主持人那样永远保持主线程。 – njzk2

+0

@ njzk2,有没有一种方法可以暂停线程(&离开系统资源),然后在某个时候返回(比如说10secs)并检查它是否空闲? – Ravi

+0

我不确定我了解您的用例。你是否等到用户停止使用手机,然后发出通知? – njzk2

回答

1

你不应该。查看isInteractive的文档:

只要设备的交互式状态发生变化,系统就会发送屏幕或屏幕关闭广播。由于历史原因,这些广播的名称是指屏幕的电源状态,但它们实际上是为了响应设备的整体交互状态的变化而发送的,如本方法所述。

而是使用广播屏幕关闭。然后在接收器中做任何你想要的代码。或者如果您需要在另一个线程上发生此线程,请让该线程等待来自此接收器的消息。

1

我做了什么来绕过这个问题。

创建一个新的Alarm Intent,在发现设备当前处于活动状态1分钟后触发通知。取消之前的警报。

捕获报警广播并重新检查用户是否正在与设备进行交互。如果他不是,则继续进行我的实际通知,即在预定义时间启动应用程序&设置新的Alarm Intent。否则,重复上一步或创建新的警报意图。

这样我就不会阻挡系统资源,我能够实现我的目标,即在设备未被用户使用时触发通知并启动我的应用程序。

相关问题