2016-12-26 3 views
0

Ich möchte einen laufenden Dienst in Android starten, die überprüft, welche Anwendung im Hintergrund ist. Wenn sich die Vordergrundanwendung in der Datenbank meiner App befindet, öffnet sich ein Passwortbildschirm, um das Passwort einzugeben.Starten Sie immer Dienst

Was ich erreicht habe, ist, dass mein Dienst so lange läuft, wie die Anwendung läuft, aber wenn ich die Anwendung stoppe (aus früheren Anwendungen entferne), stoppt mein Dienst. Ich kann die gesperrten Apps öffnen, ohne ein Passwort einzugeben. Ich habe viele Lösungen im Internet versucht, aber keine scheint zu funktionieren. Bitte helfen Sie mir,

package services; 

import android.app.Service; 
import android.content.Intent; 
import android.os.IBinder; 
import android.support.annotation.Nullable; 
import android.util.Log; 
import android.widget.Toast; 

import com.antzion.salmanali.lockapp.FeedReaderContract; 
import com.antzion.salmanali.lockapp.FeedReaderDBHelper; 
import com.antzion.salmanali.lockapp.PasswordSet; 
import com.antzion.salmanali.lockapp.Pattern; 

/** 
* Created by Salman Majid Ali on 12/26/2016. 
*/ 

public class TestService extends Service { 
String [] names; 
FeedReaderDBHelper helper; 
private AppChecker appChecker; 
private String currentLocked = ""; 
Detector detector; 

public TestService() 
{ 
    if(Utils.postLollipop()) 
     detector = new LollipopDetector(); 
    else 
     detector = new PreLollipopDetector(); 
} 

@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 
    Toast.makeText(getApplicationContext(), "service Start", Toast.LENGTH_SHORT).show(); 
    System.out.println("StartRemove"); 
    helper = new FeedReaderDBHelper(this); 
    names = helper.getNames(); 
    Thread t = new Thread(new Runnable() { 
     @Override 
     public void run() { 
      if(!AppChecker.running) 
      { 
       startChecker(); 
      } 
     } 
    }); 
    t.start(); 

    return START_STICKY; 
} 

@Nullable 
@Override 
public IBinder onBind(Intent intent) { 
    return null; 
} 

@Override 
public void onTaskRemoved(Intent rootIntent) { 
    System.out.println("Remove"); 
    Intent restart=new Intent(getApplicationContext(),this.getClass()); 
    restart.setPackage(getPackageName()); 
    startService(restart); 
    super.onTaskRemoved(rootIntent); 
} 
@Override 
public void onDestroy() 
{ 
    Intent restart=new Intent(getApplicationContext(),this.getClass()); 
    restart.setPackage(getPackageName()); 
    startService(restart); 
    super.onDestroy(); 
} 

private void startChecker() 
{ 
    appChecker = new AppChecker(); 
    appChecker 
      .when(getPackageName(), new AppChecker.Listener() { 
       @Override 
       public void onForeground(String packageName) { 
        //Toast.makeText(getBaseContext(), "Our app is in the foreground.", Toast.LENGTH_SHORT).show(); 
       } 
      }) 
      .other(new AppChecker.Listener() { 
       @Override 
       public void onForeground(String packageName) { 
        //System.out.println("Foreground " + packageName); 
        //System.out.println("In Other " + setting.getBooleanValue(PrefVars.onlock) + " " + setting.getBooleanValue(PrefVars.onLock3) + 
        //  " " + setting.getBooleanValue(PrefVars.lockImmediately)); 
        try { 

         if(currentLocked != null && !packageName.equals(currentLocked) 
           && !helper.isLocked(currentLocked) 
           && helper.getValue(FeedReaderContract.FeedEntry.onexit).equals("YES")) 
         { 
          Log.i("Locking ", currentLocked); 

          helper.lock(currentLocked); 
         } 
         if(helper.getPackageName(packageName)) 
         { 
          //System.out.println(packageName + "App is in the Database"); 
          if(helper.isLocked(packageName)) 
          { 
           System.out.println("UnLocking " + packageName); 
           getPassword(packageName); 
           currentLocked = packageName; 

          } 
         } 
        }catch(Exception e) 
        { 

        } 

        //Toast.makeText(getBaseContext(), "Foreground: " + packageName, Toast.LENGTH_SHORT).show(); 
       } 
      }) 
      .start(this); 
} 

private void getPassword(String pack) 
{ 
    int i = helper.getPassOrPat(); 
    boolean pass = false; 
    if(i == 1) 
     pass = true; 
    else 
     pass = false; 

    if(pass) 
    { 
     Intent intent = new Intent(this, PasswordSet.class); 
     intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
     intent.putExtra("PASS", pack); 
     intent.putExtra("CONFIRM", "YES"); 
     startActivity(intent); 
    } 
    else 
    { 
     Intent intent = new Intent(this, Pattern.class); 
     intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
     intent.putExtra("PASS", pack); 
     intent.putExtra("CONFIRM", "YES"); 
     startActivity(intent); 
    } 

} 

}

I AppChecker Klasse Code zur Verfügung stellen können, wenn Sie wollen. Bitte lassen Sie mich wissen, was ich tun soll, um die gewünschten Ergebnisse zu erzielen. Ich werde dir sehr dankbar sein.

+0

Haben Sie versucht, Ihren Code in OnCreate of Service zu verschieben, da wenn Service neu erstellt wird, immer OnC aufrufen reate –

+0

An welchem ​​Gerät testeest du? –

+0

Hallo, danke David für deine Antwort. Ich teste es auf HUAWEI TAG-L21 laufenden Android 5.1. Der Dienst wird beendet, wenn die App von den letzten Apps kopiert wird. –

Antwort

0

getötet wird für Anfang jemals Dienst ausgeführt wird, müssen Sie Ihren Dienst in manifest definieren wie als

<service 
     android:name=".service.youservice" 
     android:exported="true" 
     android:process=":ServiceProcess" /> 

Wenn Sie dies verwenden, wird Ihr Dienst auf einem anderen Prozess von ServiceProcess ausgeführt.

Es gibt nur wenige Schritt für lange laufenden Dienst als

  • definieren onStartCommand() return START_STICKY
  • Selbst Start in onDestroy() von Service
  • einen Deamon Dienst erstellen
  • nativen deamon Prozess erstellen (jin)
+0

Ich habe das gleiche wie Sie im Manifest beschrieben, aber nichts hilft. Und die anderen, wenn Sie es genauer erklären könnten. –

+0

Ich habe etwas gefunden. Der Dienst läuft weiterhin auf Geräten unter Lollipop, aber beim Lollipop stoppt es, egal was ich mache. Bitte helfen Sie mir dabei. –

0

Wenn der Dienst von Ihrer App gestartet wird, wird er in Ihrem App-Prozess ausgeführt und sobald die App beendet wird, wird auch der Dienst ausgeführt. Was Sie tun können, in der onTaskRemoved Methode Ihres Dienstes ist, setzen Sie diese

Intent intent = new Intent("com.whatever.restartservice"); 
sendBroadcast(intent); 

und stellen Rundfunkempfänger in Dienst selbst und in der OnReceive, den Dienst neu starten. Ich habe getestet und es funktioniert jedes Mal, wenn App getötet wird.

Edit: Versuchen Sie, diese

@Override public void onTaskRemoved(Intent rootIntent){ 
    Intent restartServiceIntent = new Intent(getApplicationContext(), this.getClass()); 

    PendingIntent restartServicePendingIntent = PendingIntent.getService(
     getApplicationContext(), 1, restartServiceIntent, PendingIntent.FLAG_ONE_SHOT); 
    AlarmManager alarmService = (AlarmManager) getSystemService(Context.ALARM_SERVICE); 
    alarmService.set(ELAPSED_REALTIME, elapsedRealtime() + 1000, 
     restartServicePendingIntent); 

    super.onTaskRemoved(rootIntent); 
} 

Es Ihren Dienst neu gestartet wird, egal wie es

+0

Was ist, wenn ich den Dienst in der onTaskRemoved selbst starte anstatt die Sendung zu senden und zu empfangen? –

+0

Ich habe getan, was Sie gesagt haben, aber der Dienst startet nicht noch einmal. Broadcast wird gesendet, aber nichts passiert. –

+0

aktualisiert die Antwort, bitte überprüfen Sie und lassen Sie es mich wissen –

Verwandte Themen