Java 服务有时不起作用
这是我的密码 MyService.javaJava 服务有时不起作用,java,android,android-studio,service,Java,Android,Android Studio,Service,这是我的密码 MyService.java public class MyService extends Service { @Override public void onCreate() { super.onCreate(); } class BackgroundTask extends AsyncTask<String,Void,String> { //My database upload code
public class MyService extends Service {
@Override
public void onCreate() {
super.onCreate();
}
class BackgroundTask extends AsyncTask<String,Void,String>
{
//My database upload code
}
}
private void ping() {
try {
BackgroundTask backgroundTask = new BackgroundTask();
backgroundTask.execute(); //Running asynctask
} catch (Exception e) {
}
scheduleNext();
}
private void scheduleNext() {
mHandler.postDelayed(new Runnable() {
public void run() {
ping();
}
}, 300000);
}
public int onStartCommand(Intent intent, int x, int y) {
mHandler = new android.os.Handler();
ping();
return START_STICKY;
}
@Override
public void onDestroy() {
super.onDestroy();
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
}
在AndroidManifest.xml中,我有以下内容:
android:permission="android.permission.RECEIVE_BOOT_COMPLETED">
<receiver android:name=".autostart">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
<service android:name=".MyService"
android:enabled="true"
>
</service>
此服务有时无法运行,有时无法正常运行。我从手机上查看应用程序管理器,发现它运行正常,但正如我所说的,有时我的代码工作,有时不工作。例如,当我打开新手机时,我会检查应用程序管理器和程序运行的服务。我无法解决问题所在。
我的意思是,MyService似乎总是在App Manager中运行,但代码有时运行有时不运行。
我注意到,当我在手机上查看AppManager时,如果MyService是4-5MB,它不会运行,如果是13-15MB。我不知道这是不是巧合。
谢谢你的帮助请查看
这是我的服务,每15秒获取一次坐标并将其保存到SQLITE,每5分钟将所有保存的坐标发送到服务器,每10分钟将完整的坐标+地址发送到服务器
不要介意onDestroy方法的内容
这只是我的私人图书馆
仅供参考:不要在onCreate方法中使用处理程序,这会导致你的应用程序没有响应
相信我,我以前试过
而是使用AlarmManager以获得更好的性能
public class service extends Service{
private AlarmManager alarm;
private PendingIntent addData, sendData, fullData;
// run on another Thread to avoid crash
private Handler mHandler = new Handler();
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onDestroy() {
if(!App.User.GetUserCode().equals("")){
App.DataFrame.InfoLog("Location is turned OFF");
App.DataFrame.Off();
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
stopAlarm();
Intent stoploc = new Intent(service.this, LocationProvider.class);
service.this.stopService(stoploc);
stopForeground(true);
stopSelf();
App.User.Logout();
App.Toast("Stopping Service");
}
}, 1000);
}else{
stopAlarm();
Intent stoploc = new Intent(service.this, LocationProvider.class);
service.this.stopService(stoploc);
stopForeground(true);
stopSelf();
App.Toast("Stopping Service");
}
super.onDestroy();
}
public void stopAlarm(){
alarm.cancel(addData);
alarm.cancel(sendData);
alarm.cancel(fullData);
}
@Override
public void onCreate() {
App.Toast("Starting Services");
alarm = (AlarmManager) getSystemService(App.GetContext().ALARM_SERVICE);
Intent intent = new Intent(this, CoorReceiver.class);
addData = PendingIntent.getBroadcast(this, 0, intent.putExtra("Code", 0), PendingIntent.FLAG_UPDATE_CURRENT);
sendData = PendingIntent.getBroadcast(this, 1, intent.putExtra("Code", 1), PendingIntent.FLAG_UPDATE_CURRENT);
fullData = PendingIntent.getBroadcast(this, 2, intent.putExtra("Code", 2), PendingIntent.FLAG_UPDATE_CURRENT);
alarm.setInexactRepeating(AlarmManager.RTC_WAKEUP, 15000, 15000, addData);
alarm.setInexactRepeating(AlarmManager.RTC_WAKEUP, 30000, 30000, sendData);
alarm.setInexactRepeating(AlarmManager.RTC_WAKEUP, 600000, 600000, fullData);
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Intent intent2 = new Intent(this, MainActivity.class);
intent2.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
PendingIntent pendIntent = PendingIntent.getActivity(this, 0, intent2, 0);
Notification noti = new Notification.Builder(getApplicationContext())
.setContentTitle("Imagine")
.setContentText("Service is Running")
.setSmallIcon(R.drawable.ic_launcher)
.setContentIntent(pendIntent)
.build();
startForeground(1234, noti);
return START_STICKY;
}
}
这和Android Studio有什么关系?我有一个数据库,可以保存用户的语言和时间。此服务每5分钟上载一次
02-04 19:57:25.125 10329-10377/com.example.pc.googlemaps I/GMPM: App measurement is starting up
02-04 19:57:25.135 10329-10377/com.example.pc.googlemaps E/GMPM: getGoogleAppId failed with status: 10
02-04 19:57:25.135 10329-10377/com.example.pc.googlemaps E/GMPM: Uploading is not possible. App measurement disabled
public class service extends Service{
private AlarmManager alarm;
private PendingIntent addData, sendData, fullData;
// run on another Thread to avoid crash
private Handler mHandler = new Handler();
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onDestroy() {
if(!App.User.GetUserCode().equals("")){
App.DataFrame.InfoLog("Location is turned OFF");
App.DataFrame.Off();
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
stopAlarm();
Intent stoploc = new Intent(service.this, LocationProvider.class);
service.this.stopService(stoploc);
stopForeground(true);
stopSelf();
App.User.Logout();
App.Toast("Stopping Service");
}
}, 1000);
}else{
stopAlarm();
Intent stoploc = new Intent(service.this, LocationProvider.class);
service.this.stopService(stoploc);
stopForeground(true);
stopSelf();
App.Toast("Stopping Service");
}
super.onDestroy();
}
public void stopAlarm(){
alarm.cancel(addData);
alarm.cancel(sendData);
alarm.cancel(fullData);
}
@Override
public void onCreate() {
App.Toast("Starting Services");
alarm = (AlarmManager) getSystemService(App.GetContext().ALARM_SERVICE);
Intent intent = new Intent(this, CoorReceiver.class);
addData = PendingIntent.getBroadcast(this, 0, intent.putExtra("Code", 0), PendingIntent.FLAG_UPDATE_CURRENT);
sendData = PendingIntent.getBroadcast(this, 1, intent.putExtra("Code", 1), PendingIntent.FLAG_UPDATE_CURRENT);
fullData = PendingIntent.getBroadcast(this, 2, intent.putExtra("Code", 2), PendingIntent.FLAG_UPDATE_CURRENT);
alarm.setInexactRepeating(AlarmManager.RTC_WAKEUP, 15000, 15000, addData);
alarm.setInexactRepeating(AlarmManager.RTC_WAKEUP, 30000, 30000, sendData);
alarm.setInexactRepeating(AlarmManager.RTC_WAKEUP, 600000, 600000, fullData);
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Intent intent2 = new Intent(this, MainActivity.class);
intent2.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
PendingIntent pendIntent = PendingIntent.getActivity(this, 0, intent2, 0);
Notification noti = new Notification.Builder(getApplicationContext())
.setContentTitle("Imagine")
.setContentText("Service is Running")
.setSmallIcon(R.drawable.ic_launcher)
.setContentIntent(pendIntent)
.build();
startForeground(1234, noti);
return START_STICKY;
}
}