6

Ich erstelle eine App, die eine Aktivität startet, sobald der Benutzer dreimal die Einschalttaste drückt. Nach einigen Nachforschungen fand ich heraus, dass Sie zuerst einen Dienst erstellen müssen, der einen Broadcast-Empfänger startet, um den Ein-/Aus-Status des Bildschirms zu überprüfen.So halten Sie den Dienst im Hintergrund an

Grundsätzlich möchte ich das auch laufen, wenn die App geschlossen ist. Es sollte eine weitere Aktivität starten, sobald der Ein-/Ausschalter 3 Mal oder öfter gedrückt wird.

Wenn Sie die Lösung kennen, geben Sie mir bitte den vollständigen Code oder einen Link zu der Antwort.

ich schaffte es irgendwie, diesen Code zu schreiben, aber es funktioniert nicht:

UpdateService.java

Dies ist die Dienstklasse I verwendet:

import android.app.Service; 
import android.content.BroadcastReceiver; 
import android.content.Intent; 
import android.content.IntentFilter; 
import android.os.IBinder; 
import android.util.Log; 
import android.widget.Toast; 

public class UpdateService extends Service { 

    BroadcastReceiver mReceiver; 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
    // register receiver that handles screen on and screen off logic 
     IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_ON); 
     filter.addAction(Intent.ACTION_SCREEN_OFF); 
     mReceiver = new MyReceiver(); 
     registerReceiver(mReceiver, filter); 
    } 

    @Override 
    public void onDestroy() { 

     unregisterReceiver(mReceiver); 
     Log.i("onDestroy Reciever", "Called"); 

     super.onDestroy(); 
    } 

    @Override 
    public void onStart(Intent intent, int startId) { 
     boolean screenOn = intent.getBooleanExtra("screen_state", false); 
     if (!screenOn) { 
     Log.i("screenON", "Called"); 
     Toast.makeText(getApplicationContext(), "Awake", Toast.LENGTH_LONG) 
      .show(); 
     } else { 
     Log.i("screenOFF", "Called"); 
     Toast.makeText(getApplicationContext(), "Sleep", 
    Toast.LENGTH_LONG) 
    .show(); 
     } 
} 

@Override 
public IBinder onBind(Intent intent) { 
// TODO Auto-generated method stub 
return null; 
} 
} 

MyReceiver.java

import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 

public class MyReceiver extends BroadcastReceiver { 
private boolean screenOff; 

@Override 
public void onReceive(Context context, Intent intent) { 
if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) { 
    screenOff = true; 
} else if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) { 
    screenOff = false; 
} 
Intent i = new Intent(context, UpdateService.class); 
i.putExtra("screen_state", screenOff); 
context.startService(i); 
} 
} 

mainfest.xml

<receiver android:name=".MyReceiver"> 
<intent-filter> 
<action android:name="android.intent.action.SCREEN_OFF"/> 
<action android:name="android.intent.action.SCREEN_ON"/> 
</intent-filter> 
</receiver> 
<service android:name=".UpdateService" /> 

Bitte erwähnen Sie auch, wenn ich etwas in meine Datei mainactivity.java oder die Aktivität, um umleiten zu müssen.

Ich habe diese Berechtigungen verwendet:

<uses-permission android:name="com.android.alarm.permission.SET_ALARM" /> 
<uses-permission android:name="android.permission.VIBRATE" /> 
<uses-permission android:name="android.permission.READ_CONTACTS" /> 
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> 
<uses-permission android:name="android.permission.WAKE_LOCK" /> 
<uses-permission android:name="android.permission.INTERNET" /> 
<uses-permission android:name="android.permission.SEND_SMS" /> 
<uses-permission android:name="android.permission.RECEIVE_SMS" /> 
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> 
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> 
+0

Ist dies der richtige Weg, oder muß ich eine andere Methode verwendet –

+2

Bitte Hilfe ich kann es im Hintergrund Dienst arbeiten ichecked aber die Update zeigt nicht nach oben –

Antwort

0

Haben Sie nicht vollständigen Code sicher zu wissen, aber lassen Sie mir eine Vermutung machen:

Sie keine Anwendung oder Aktivität umgesetzt hat Ja?

Ich denke, Sie brauchen mindestens eine von ihnen, um den Empfänger in onCreate() onResume() Rückrufe zu registrieren, einfach unter Angabe eines Empfängers in Manifest könnte nicht funktionieren.

Und Debugging in Eclipse oder jeder anderen IDE mit Android-Integration kann wirklich hilfreich sein, da es die Prozesse Ihrer App zeigt, und Sie können sicher wissen, ob sie erzogen werden oder nicht. Ein kleines Debugging soll Ihnen sagen, ob Ihr Receiver richtig funktioniert.

Wenn Sie mehr Code teilen möchten, können wir natürlich weiter diskutieren.

+0

Was schlagen Sie vor, ich sollte tun –

+0

Haken Sie Ihren Code in Eclipse und debuggen Ypur Empfänger? Wenn kein Glück, versuchen Sie den Empfänger programmgesteuert zur Laufzeit mit einer Anwendung oder Aktivität zu registrieren? –

0

Versuchen Sie das?

MyService 
public class MyService extends Service { 
    @Override 
    public void onCreate() { 
     super.onCreate(); 

     ... 

     if (!registered) { 
      MyReceiver mybroadcast = new MyReceiver() { 
      registerReceiver(mybroadcast, new IntentFilter(Intent.ACTION_SCREEN_ON)); 
      registerReceiver(mybroadcast, new IntentFilter(Intent.ACTION_SCREEN_OFF)); 
     } 
    } 
} 

MyReceiver 
public class MyReceiver extends BroadcastReceiver { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     ... 
    } 
} 

BootStartUpReciever 
public class BootStartUpReciever extends BroadcastReceiver { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     // Start Service On Boot Start Up 
     Intent service = new Intent(context, MyService.class); 
     context.startService(service); 
    } 
} 



Manifest 

<service android:name="my.package.MyService" /> 
<receiver 
    android:name="my.package.BootStartUpReciever" android:enabled="true" android:exported="true" > 
    <intent-filter> 
     <action android:name="android.intent.action.BOOT_COMPLETED" /> 
     <category android:name="android.intent.category.LAUNCHER" /> 
    </intent-filter> 
</receiver> 
+0

es zeigt Fehler in MyService-Datei –

+0

Syntaxfehler oder Tokkens, falsch platzierte Konstruktur, müssen auch auf Bind-Methode –

+2

hinzufügen Ich gab die Mindestcodes. Siehst du ...? Das soll durch deine Logikcodes ersetzt werden. – twb

0

Ich denke, es gibt keine Notwendigkeit für die Serviceklasse für Ihre Anforderung. Weil Sie eine Aktivität starten, wenn der Bildschirm bei Aktion aufgerufen wird. Bitte beziehen Sie sich auf meine folgende Implementierung und teilen Sie Ihre Gedanken.

//Application class. 
    public class MyApplication extends Application { 
     static String TAG = "MyApplication"; 
     @Override 
     public void onCreate() { 
      super.onCreate(); 

      IntentFilter intentFilter = new IntentFilter(Intent.ACTION_SCREEN_ON); 
      intentFilter.addAction(Intent.ACTION_SCREEN_OFF); 
      registerReceiver(new BroadcastReceiver() { 
       @Override 
       public void onReceive(Context context, Intent intent) { 
        // screen off 
        if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) { 
         Log.d(TAG, Intent.ACTION_SCREEN_OFF); 
         //screen on 
        } else if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) { 
         Log.d(TAG, Intent.ACTION_SCREEN_ON); 
         // To open your main activity. 
         Intent i = new Intent(); 
         i.setClass(context, MainActivity.class); 
         i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
         i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
         context.startActivity(i); 
        } 
       } 
      }, intentFilter); 
     } 

    } 

    // Manifest.xml 

    <?xml version="1.0" encoding="utf-8"?> 
    <manifest xmlns:android="http://schemas.android.com/apk/res/android" 
     package="com.hopabit.wakeup" 
     android:versionCode="1" 
     android:versionName="1.0" > 

     <uses-sdk 
      android:minSdkVersion="8" 
      android:targetSdkVersion="19" /> 

     <application 
      android:name=".MyApplication" 
      android:allowBackup="true" 
      android:icon="@drawable/ic_launcher" 
      android:label="@string/app_name" 
      android:theme="@style/AppTheme" > 
      <activity 
       android:name="com.hopabit.wakeup.MainActivity" 
       android:label="@string/app_name" > 
       <intent-filter> 
        <action android:name="android.intent.action.MAIN" /> 

        <category android:name="android.intent.category.LAUNCHER" /> 
       </intent-filter> 
      </activity> 
     </application> 

    </manifest> 
0

Um Ihren Dienst am Laufen zu halten, müssen Sie in einen Thread einfügen. Stellen Sie sicher, dass sich der service in einem zusätzlichen Thread befindet, da ein Dienst für sich kein zusätzlicher Prozess oder Thread ist. Dies könnte beispielsweise mit einer Handler erfolgen.

HandlerThread thread = new HandlerThread(SERVICE_THREAD_NAME); 
thread.start(); 
handlerThreadId = thread.getId(); 
serviceLooper = thread.getLooper(); 
serviceHandler = new ServiceHandler(serviceLooper); 
0

Ich sah Ihren Code. Sie sind der Lösung sehr nahe.

Ihren breiten Guss Empfänger registrieren Sie sich für beiden Ereignisse auf sowie Bildschirm abschirmen innerhalb des onCreate() von Ihnen Aktivität

if (!registered) { 
      MyReceiver mybroadcast = new MyReceiver() { 
      registerReceiver(mybroadcast, new IntentFilter(Intent.ACTION_SCREEN_ON)); 
      registerReceiver(mybroadcast, new IntentFilter(Intent.ACTION_SCREEN_OFF)); 
} 

einen int-Zähler in gemeinsamen Vorlieben pflegen oder sonst wo, es mit 0 initialisiert auf dem ersten und Zuwachs, die Zähler in OnReceive():

public class MyReceiver extends BroadcastReceiver { 
private boolean screenOff; 

@Override 
public void onReceive(Context context, Intent intent) { 

int counter = get counter value from shared preference. 

if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) { 
    screenOff = true; 
    //increment the counter++ 

} else if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) { 
    screenOff = false; 
    //increment the counter++ 
} 

if(counter>3){ 
Intent i = new Intent(context, UpdateService.class); 
i.putExtra("screen_state", screenOff); 
context.startService(i); 
} 
} 
} 
0

Sie Dienst starten können und es häufig und auch hören Ereignis on Boot zu wiederholen. Sie können diesen Link verwenden, bei dem ein Dienst die ganze Zeit ausgeführt wird. https://github.com/commonsguy/cwac-wakeful Es könnte in Ihrem Problem helfen.

0

Ich denke, was Sie brauchen, ist ein IntentService verwenden.

Ich werde Ihnen sagen, warum:

Dienst auf dem UI-Thread ausgeführt wird (auch wenn im Hintergrund ist), so ist dies besser für die Interaktion mit der Benutzeroberfläche, aber auf der anderen Seite, sollen sie nicht sein lange laufen, wie du willst. Abgesehen davon läuft der IntentService auf einem anderen Thread, daher ist es besser, sie für Hintergrundaufgaben zu verwenden, die länger sind.

Was Sie tun sollten, ist im Speicher (mit dem Application-Objekt) oder einem anderen Singleton die Zeiten der Bildschirm ON/OFF-Status zu speichern.

Wenn Sie weitere Hilfe benötigen, lassen Sie es mich wissen

Verwandte Themen