用于定位的 Android 前台服务

And*_*rea 1 service gps android locationmanager

我需要制作一个每次都在后台运行的应用程序(间谍应用程序)并将设备的位置发送到服务器。

我不想使用 Google Api。

我尝试使用服务、意图服务、前台服务、用于套接字等的线程等,但是当我关闭主要活动时,它在后台运行,有时然后被杀死。

我怎样才能做到这一点?求求你,帮帮我<3

Pra*_*pta 5

是的,让我告诉你,如果你有小米、OPPO、Vivo 等设备。您的服务将被他们杀死。所以无论你怎么努力,如果你没有在设置中勾选自动启动,它都会被杀死。所以你必须绑定用户来检查它以使你的应用程序在后台运行。

所以,你可以做很多事情:

  1. 通过在每个给定的时间间隔内从服务器向用户发送推送通知,在 GCM 服务的接收器中重新启动您的服务。

`

public class GcmNetworkTask extends GcmTaskService {

        @Override
        public int onRunTask(TaskParams taskParams) {
            restartYourServiceHere();
            return 0;
        }
    }
Run Code Online (Sandbox Code Playgroud)
  1. AlarmManager 重新启动您的服务。

    Bootcomplete 接收器用于在系统重新启动时启动您的服务

    公共类 BootCompleteReceiver 扩展 BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
            Intent service = new Intent(context, Sample_service.class);
            context.startService(service);
    }
    
    Run Code Online (Sandbox Code Playgroud)

    }

然后服务的 onstartCommand 中的警报管理器将执行以下操作:

 intent = new Intent(this, ReceiverClass.class);
    PendingIntent pendingIntent = PendingIntent.getBroadcast(
            this.getApplicationContext(), 234324243, intent, 0);
    AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
    alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis()
                + (40000), pendingIntent);
    return START_STICKY;
Run Code Online (Sandbox Code Playgroud)

然后又是一个接收器类来捕捉警报管理器:

   public class ReceiverClass extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
      context.startService(new Intent(context, Sample_service.class));

    }
}
Run Code Online (Sandbox Code Playgroud)
  1. 如果活动暂停,可运行线程将工作,但如果用户破坏活动,则将停止。

要查找位置,您可以使用 Google fusedLocationAPI、位置管理器(如果您没有获得 GPS,您也可以通过网络获取位置)。

  1. 如果有人发现它太棘手,您可以使用 hack :在服务的 OnDestroy 中重新启动您的服务:

    @Override public void onDestroy() { Intent startSeviceIntent = new Intent(getApplicationContext(), SampleService.class); startService(startSeviceIntent); super.onDestroy(); } 在 onStartCommand 方法中获取位置并执行您想要的操作。