2017-06-06 5 views
0

Ich möchte eine Android-Anwendung arbeiten im Hintergrund arbeiten. Ich habe gelesen, dass ich dafür Dienste verwenden muss. In dieser Anwendung muss ich wissen, wann der Bildschirm gesperrt wird und wann es wieder entsperrt wird. Jedes Mal, wenn dies passiert, muss ich etwas tun.Android im Dienst Wie weiß man, wenn der Bildschirm gesperrt ist?

Für Aktivitäten habe ich gesehen, dass wir onPause und onRestart dafür haben, aber ich muss wissen, wann der Bildschirm ausgeschaltet ist und wann es in einem Dienst eingeschaltet ist. Wie können diese Informationen aus einem Service abgerufen werden?

+0

Bitte stellen Sie sicher, dass Sie wirklich, wirklich wissen wollen, ob die Geräte _locked_, denn wie können Sie Aus der "Diskussion" über die potentielle Duplikatsfrage kann dies nicht der Fall sein. Außerdem denke ich, dass die Methode darauf hindeutet, dass es nicht so ist, wie es gemacht werden sollte, aber das ist ein anderer Punkt. –

Antwort

1

Bildschirm ein-/ausschalten erzeugt Systemereignisse. Sie müssen diese Sendungen hören und sie erfassen. Fügen Sie das Ihrem Manifest hinzu:

<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> 

Und dann registrieren Sie einen Broadcast-Empfänger, um es in Ihrem Dienst zu erfassen.

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

Ich habe es jetzt versucht, und das funktioniert! Aber dieser Code sagt mir nur, wenn der Bildschirm eingeschaltet ist und nicht wenn der Bildschirm gesperrt ist. Ich habe beweisen mit fügen Sie dies bei dem Code: if (intent.getAction(). Entspricht (Intent.ACTION_SHUTDOWN)) Aber nicht funktionieren, Sie wissen, wie ich diese Funktion hinzufügen kann? – Simone

+0

Sie müssen eine Liste der Systemübertragungen überprüfen und genau die finden, die Sie benötigen. Sie finden diese Liste hier: https://developer.android.com/reference/android/content/Intent.html –

+0

Auch wenn nur die erste Absicht gefangen wird, versuchen Sie, sie in separate '' s in Ihrem Manifest –

0

können Sie dieses, das hilft

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

Hoffnung verwenden.

+0

Hallo Dank für die Antwort, aber wo muss ich das hinzufügen? Ich möchte, dass der Dienst im Hintergrund funktioniert, und es muss immer den Bildschirm ON und Screen Off erfassen. Ich habe versucht, diesen Code in den Konstruktor des Dienstes einzufügen, aber ich habe einen Fehler: java.lang.RuntimeException: Service kann nicht instanziiert werden com.example.simon.dataconnection.DisableDataService: java.lang.NullPointerException: Versuch, virtuelle aufzurufen Methode 'java.lang.Object android.content.Context.getSystemService (java.lang.String)' auf einem Nullobjekt Referenz – Simone

+0

In Bezug auf den Service muss ich darüber nachforschen. –

+0

Es sieht so aus, als hättest du es von [hier] kopiert (https://stackoverflow.com/a/8668648/1856738). 1) Dies ist das genaue Q & A, mit dem dieses Q als Duplikat verknüpft ist. 2) Das Original A erwähnt eine Einschränkung, die Sie nicht kopiert haben. Bitte beachten Sie, dass das Kopieren auf einer Q & A-Website nicht hilfreich ist. Je weniger Kopien, desto höher die Chancen, die richtigen Antworten zu finden - einfache Suchroboter-Arithmetik. Ja, es ist in diesem Fall schwieriger, Kreditpunkte zu sammeln, aber es führt zu höherer Qualität. –

0

Verwenden Sie diese Aktionen in Empfänger-Tag in manifest

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

Ich muss dies versuchen, ich habe dies in Manifest einfügen, und im Empfänger in Methode onReceive habe ich diese zwei Methoden, wenn (intent.getAction(). Equals (Intent.ACTION_SCREEN_ON)) und if (intent .getAction(). equals (Intent.ACTION_SCREEN_OFF)) Aber nicht funktionieren, wenn mein Bildschirm ein- oder ausgeschaltet ist, tritt dies nicht in if auf. Sie wissen, wie ich das lösen kann? – Simone

+0

Haben Sie Ihre Sendung registriert? – 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

I Android-Anwendung arbeiten im Hintergrund erstellt werden soll, ich habe gelesen, dass ich die Dienste nutzen haben.

Ja, wahrscheinlich müssen Sie Dienste verwenden, um zu überprüfen, ob der Bildschirm noch an oder ausgeschaltet ist. Zum Beispiel in onCreate Ihrer Services Klasse.

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

Eigentlich:

Intent.ACTION_SCREEN_OFF 

oder

Intent.ACTION_SCREEN_ON 

Sind zwei wichtigsten Dinge, die in Ihrem BroadcastReceiver gehen muss. Zum Beispiel in Ihrer onReceive Methode:

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 
    } 

Für detailliertere expnlanation einen Blick in diesem Artikel nehmen: https://thinkandroid.wordpress.com/2010/01/24/handling-screen-off-and-screen-on-intents/

Verwandte Themen