Android前台服务的位置

时间:2018-02-09 22:00:36

标签: android service gps locationmanager

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

我不想使用Google Api。

我尝试使用Service,IntentService,Foreground服务,Thread for socket等等,但当我关闭主活动它在后台运行时有时会被杀死。

我该怎么做? 求求你,帮帮我< 3

1 个答案:

答案 0 :(得分:4)

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

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

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

    public class GcmNetworkTask extends GcmTaskService {
    
            @Override
            public int onRunTask(TaskParams taskParams) {
                restartYourServiceHere();
                return 0;
            }
        }
    
    1. AlarmManager重启您的服务。

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

      公共类BootCompleteReceiver扩展了BroadcastReceiver {

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

      }

    2. 然后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;
      

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

         public class ReceiverClass extends BroadcastReceiver {
          @Override
          public void onReceive(Context context, Intent intent) {
            context.startService(new Intent(context, Sample_service.class));
      
          }
      }
      
      1. 如果活动暂停,Runnable线程将起作用,但如果用户破坏活动,则会停止。
      2. 要查找位置,您可以使用Google fusedLocationAPI,位置管理器(如果您没有获得gps,您也可以通过网络获取位置)。

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

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