我不确定我是否有这个权利,但我有一些代码需要在我的android应用程序的后台运行,一旦完成,我想等待10秒,然后运行代码再次。
我目前有这个工作,但我相信这不是正确的方法,并想知道是否有人可以给我一个简单的例子,或告诉我我需要改变什么才能使这个“正确的方式“做到这一点。
首先我有我的ScheduleService.java文件。这是我想要运行它的代码的地方,正如你所看到的,一旦它完成,它会让线程休眠10秒然后再次调用自己,但这意味着代码永远不会实际完成(你应该如果出现错误,请查看堆栈跟踪的长度!)
ScheduleService.java
public class ScheduleService extends Service {
private static final String TAG = "ScheduleService";
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Thread t = new Thread(new Runnable() {
@Override
public void run() {
startJob();
}
});
t.start();
return Service.START_STICKY;
}
private void startJob(){
// all my code is here, and i do what i need
// job completed. Rest for 10 seconds before doing another one
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//do job again
startJob();
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onCreate() {
super.onCreate();
}
@Override
public void onDestroy(){
super.onDestroy();
}
}
现在启动服务代码,我的应用程序启动时会有以下内容(在我的MainActivity.java文件中)
// stop just encase its already started
context.stopService(new Intent(context, ScheduleService.class));
// start service
context.startService(new Intent(context, ScheduleService.class));
为了确保在设备重启时启动服务,我还有我的StartOnBootReciever.java代码
public class StartOnBootReciever extends BroadcastReceiver {
private static final String TAG = "Autostart";
/**
* Listens for Android's BOOT_COMPLETED broadcast and then executes
* the onReceive() method.
*/
@Override
public void onReceive(Context context, Intent arg1) {
Log.d(TAG, "BOOT_COMPLETED broadcast received. Executing starter service.");
// upload in background
Intent intent = new Intent(context, ScheduleService.class);
context.startService(intent);
// This code will start the application once the device has been restarted
Intent i = new Intent(context, MainActivity.class);
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(i);
}
}
然后在我的AndroidManifest.xml文件中,我有以下
<receiver android:enabled="true" android:exported="true" android:name="StartOnBootReciever" android:permission="android.permission.RECEIVE_BOOT_COMPLETED">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
<action android:name="android.intent.action.QUICKBOOT_POWERON" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</receiver>
<service android:enabled="true" android:exported="false" android:name="com.idamigo.ticketmachine.ScheduleService" />
这一切都有效,但我觉得有代码可以自我调用,而且“永无止境”
答案 0 :(得分:1)
在服务中,您使用了Thread.Sleep
这是不必要的。因为服务将在后台持续运行,直到您停止它或系统停止它。
示例:强>
public class ScheduleService extends Service {
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Timer timer = new Timer();
timer.schedule(task,1,10000);
return Service.START_STICKY;
}
TimerTask task= new TimerTask() {
@Override
public void run() {
//do your task here.
}
};
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
}
仅在需要在后台连续运行任务时才转到“服务”。否则,请使用IntentService。当没有工作时,IntentService将被停止,因此您不需要自己管理其状态。