我需要制作一个每次都在后台运行的应用程序(间谍应用程序),并将设备的位置发送到服务器。
我不想使用Google Api。
我尝试使用Service,IntentService,Foreground服务,Thread for socket等等,但当我关闭主活动它在后台运行时有时会被杀死。
我该怎么做? 求求你,帮帮我< 3
答案 0 :(得分:4)
是的,让我告诉你,如果你有像小米,oppo,Vivo这样的设备。你的服务会被他们杀死。所以无论你怎么努力,如果你没有在设置中检查自动启动,它将会被杀死。所以你必须绑定用户检查它以使你的应用程序在后台运行。
所以,你可以做很多事情:
`
public class GcmNetworkTask extends GcmTaskService {
@Override
public int onRunTask(TaskParams taskParams) {
restartYourServiceHere();
return 0;
}
}
AlarmManager重启您的服务。
Bootcomplete接收器用于在系统重新启动时启动服务
公共类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));
}
}
要查找位置,您可以使用Google fusedLocationAPI,位置管理器(如果您没有获得gps,您也可以通过网络获取位置)。
如果有人发现它太棘手,你就可以使用hack:在OnDestroy服务中重新启动你的服务:
@Override
public void onDestroy() {
Intent startSeviceIntent = new Intent(getApplicationContext(), SampleService.class);
startService(startSeviceIntent);
super.onDestroy();
}
并在onStartCommand方法内部获取位置并执行您想要的任何操作。