我需要制作一个每次都在后台运行的应用程序( spy 应用程序),并将设备的位置发送到服务器。
我不想使用 Google Api。
我尝试使用服务、IntentService、前台服务、套接字线程等,但是当我关闭主要 Activity 时,它有时会在后台运行然后被杀死。
我该怎么做? 求求你,帮帮我 <3
最佳答案
是的,让我告诉你,如果你有像小米、oppo、vivo 这样的设备。你的服务会被他们杀死。所以不管你怎么努力,如果你没有在设置中勾选自动启动,它就会被杀死。所以你必须绑定(bind)用户检查它才能让你的应用程序在后台运行。
所以,您可以做很多事情:
- 通过在每个给定的时间间隔内从服务器向用户发送推送通知,在 GCM 服务的接收器中重新启动您的服务。
`
public class GcmNetworkTask extends GcmTaskService {
@Override
public int onRunTask(TaskParams taskParams) {
restartYourServiceHere();
return 0;
}
}
AlarmManager 以重新启动您的服务。
Bootcomplete 接收器用于在系统重启时启动您的服务
公共(public)类 BootCompleteReceiver 扩展 BroadcastReceiver {
@Override public void onReceive(Context context, Intent intent) { Intent service = new Intent(context, Sample_service.class); context.startService(service); }
然后服务的 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));
}
}
- 如果 Activity 暂停,Runnable 线程将工作,但如果用户销毁 Activity,它将停止。
要查找位置,您可以使用 Google fusedLocationAPI,位置管理器(如果您没有获取 gps,您也可以通过网络获取位置)。
如果有人觉得它太棘手,您可以使用 hack:在服务的 OnDestroy 中重新启动您的服务:
@Override 公共(public)无效onDestroy(){ Intent startSeviceIntent = new Intent(getApplicationContext(), SampleService.class); 启动服务(启动服务 Intent ); super .onDestroy(); }
在 onStartCommand 方法中获取位置并做任何你想做的事。
关于用于位置的 Android 前台服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48714737/