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。否則,重複上一步或創建新的警報意圖。

這樣我就不會阻擋系統資源,我能夠實現我的目標,即在設備未被用戶使用時觸發通知並啓動我的應用程序。

相關問題