2017-06-06 85 views
0

我想在後臺處理Android應用程序工作。我讀過,我必須使用服務爲此。 在這個應用程序中,我需要知道屏幕什麼時候被鎖定以及什麼時候再次解鎖。每次發生這種情況,我都必須採取一些行動。Android在服務中如何知道屏幕鎖定的時間?

對於活動,我已經看到我們有onPause和onRestart這個,但我需要知道何時關閉屏幕以及何時在服務中打開它。如何從服務內部檢索這些信息。

+0

請確保你真的想知道是否該設備被_locked_,因爲你可以從關於潛在重複問題的「討論」中看到,這可能永遠不會是這樣。另外,我認爲這種方法並不是應該做的,但這是另一點。 –

回答

1

打開/關閉屏幕會產生系統事件。你必須聽取這些廣播並捕捉它們。將此添加到您的清單中:

<receiver android:name=".ScreenLockBroadcastReceiver"> 
    <intent-filter> 
    <action android:name="android.intent.action.USER_PRESENT" /> 
    <action android:name="android.intent.action.ACTION_SHUTDOWN" /> 
</intent-filter> 
</receiver> 

然後註冊一個廣播接收器將其捕獲到您的服務中。

public class ScreenLockBroadcastReceiver extends BroadcastReceiver { 
    @Override 
    public void onReceive(Context arg0, Intent intent) { 
     if (intent.getAction().equals(Intent.ACTION_USER_PRESENT)) { 
      // do stuff 
     } 
    } 
} 
+0

我已經嘗試過,而且這項工作! 但是這段代碼只能告訴我屏幕何時開啓,而不是屏幕鎖定時。 如果(intent.getAction()。equals(Intent.ACTION_SHUTDOWN)) 我已經證明在代碼中加上這個: 但是不行,你知道我該如何添加這個功能? – Simone

+0

您需要檢查系統廣播列表並找到您需要的廣播。你可以在這裏找到這個列表:https://developer.android.com/reference/android/content/Intent。html –

+0

此外,如果只有第一個意圖被捕獲,請嘗試將它們放在您的清單中的單獨的中s –

0

您可以使用此

KeyguardManager keyguardManager = (KeyguardManager) 
context.getSystemService(Context.KEYGUARD_SERVICE); 
if(keyguardManager.inKeyguardRestrictedInputMode()) { 
    //it is locked 
    } else { 
    //it is not locked 
} 

希望這有助於。

+0

嗨,感謝您的回覆,但是我要添加這個嗎?我希望服務能夠在後臺工作,並且必須始終捕獲屏幕開啓和屏幕關閉。 我已嘗試將此代碼插入到服務的構造函數中,但我有一個錯誤: java.lang.RuntimeException:無法實例化服務com.example.simon.dataconnection.DisableDataService:java.lang.NullPointerException:嘗試調用虛擬方法'java.lang.Object android.content.Context.getSystemService(java.lang.String)'null對象引用 – Simone

+0

關於thr服務,我將不得不研究這個。 –

+0

它看起來像你從[這裏]複製它(https://stackoverflow.com/a/8668648/1856738)。 1)這是Q作爲重複鏈接的確切問答。 2)原始A提到了你沒有複製的限制。請考慮到在問答網站上覆制是沒有用的。副本越少,找到正確答案的機會就越高 - 簡單的搜索機器人算法。是的,在這種情況下積累信用點更加困難,但會導致更高的質量。 –

0

使用此行爲在接收器標籤清單中

<action android:name="android.intent.action.SCREEN_ON" /> 
<action android:name="android.intent.action.SCREEN_OFF" /> 
+0

我必須嘗試這一點,我已經插入這個清單,並在接收方onReceive我已經插入這兩個方法,如果(intent.getAction()。等於(Intent.ACTION_SCREEN_ON))和如果(意圖.getAction()。equals(Intent.ACTION_SCREEN_OFF))但是不起作用,當我的屏幕打開或關閉時,如果沒有輸入。 你知道我該如何解決這個問題? – Simone

+0

你註冊了你的廣播嗎? – Pratik

+0

ScreenLockBroadcastReceiver mBroadcastReceiver = new ScreenLockBroadcastReceiver(); IntentFilter screenStateFilter = new IntentFilter(); screenStateFilter.addAction(Intent.ACTION_SCREEN_ON); screenStateFilter.addAction(Intent.ACTION_SCREEN_OFF); registerReceiver(mBroadcastReceiver,screenStateFilter); – Pratik

0

我想在後臺創建Android應用程序的工作,我讀過,我必須使用的服務。

是的,可能你必須使用服務來檢查屏幕仍然開着或熄滅。例如在Services類的onCreate中。

IntentFilter intentFilter = new IntentFilter(Intent.ACTION_SCREEN_ON); filter.addAction(Intent.ACTION_SCREEN_OFF); BroadcastReceiver broadcast = new MyBroadcastReciverClass(); //or registerReceiver(broadcast , intentFilter);

其實:

Intent.ACTION_SCREEN_OFF 

Intent.ACTION_SCREEN_ON 

是將在你的BroadcastReceiver走得太2分主要的事情。例如,在您的onReceive方法:

if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) { 
     // CODE HERE FOR SCREEN OFF 
    } else if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) { 
     // CODE HERE FOR SCREEN ON 
    } 

如需更詳細的expnlanation藉此文章一看:https://thinkandroid.wordpress.com/2010/01/24/handling-screen-off-and-screen-on-intents/