开始运行服务

时间:2016-12-26 11:48:40

标签: android android-studio android-service

我想在android中启动一个永远运行的服务,检查哪个应用程序在后台。如果前台应用程序位于我的应用程序的数据库中,则会打开密码屏幕以输入密码。

我所获得的是,只要应用程序正在运行,我的服务就会运行,但是当我停止应用程序(从以前的应用程序中删除它)时,我的服务就会停止。我可以打开锁定的应用程序而无需输入密码。我在互联网上尝试了很多解决方案,但似乎都没有。请帮帮我,

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);
    }

}

}

如果需要,我可以提供AppChecker类的代码。请让我知道我该怎么做才能达到预期的效果。我将非常感谢你。

2 个答案:

答案 0 :(得分:0)

如果您的应用程序启动了服务,它将在您的应用程序进程中运行,并且一旦应用程序被杀,服务也将立即运行。你可以做的是在服务的onTaskRemoved方法中,把这个

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

并在服务本身和onReceive中设置广播接收器,重启服务。我已经测试过,每次应用程序被杀死时都可以使用。

编辑: 试试这个

 @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); 
}

无论如何杀死它都会重启你的服务

答案 1 :(得分:0)

要开始运行服务,您必须在清单中定义服务,如

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

通过使用它,您的服务将在另一个ServiceProcess进程上运行。

将长期运行服务定义为

的步骤很少
  • onStartCommand()返回START_STICKY
  • 在服务的onDestroy()中自行启动
  • 创建deamon服务
  • 创建本机deamon进程(jin)