我想创建一个服务,即在10秒后运行的方法,一遍又一遍,直到我停止它,即使该应用程序被关闭。我试图code低于
I want to create a service, that runs a method after 10 seconds over and over again, until I stop it, even if the app is closed. My attempted code is below
package com.example.tauben;
import java.util.Timer;
import java.util.TimerTask;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.widget.Toast;
public class Reminder extends Service {
@Override
public IBinder onBind(Intent arg0) {
return null;
}
@Override
public void onCreate() {
TimerTask task = new TimerTask() {
public void run(){
f();
}
};
Timer timer = new Timer();
timer.scheduleAtFixedRate(task, 0, 10000);
}
public void f(){
Toast t = Toast.makeText(this, "Service is still running", Toast.LENGTH_SHORT);
t.show();
}
}
和我这是怎么启动该服务。
And this is how I start the service.
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.d(Log_TAG,"_____________RESTART__________");
Intent i= new Intent(this, Reminder.class);
startService(i);
}
只是立即停止运行的程序;我怎样才能改变我的code,以获得所需的行为吗?
The program just stops running immediately; how can I change my code to get the desired behaviour?
创建一个广播接收器接收广播后,将开始为您服务 AlarmManager
:
create a broadcast receiver that will start your service after receiving broadcast from AlarmManager
:
public class SyncAlarm extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent data) {
// set alarm to start service
Calendar calendar = new GregorianCalendar();
calendar.setTimeInMillis(System.currentTimeMillis());
Calendar cal = new GregorianCalendar();
cal.set(Calendar.DAY_OF_YEAR, calendar.get(Calendar.DAY_OF_YEAR));
cal.set(Calendar.HOUR_OF_DAY, calendar.get(Calendar.HOUR_OF_DAY));
// start service after an hour
cal.set(Calendar.MINUTE, calendar.get(Calendar.MINUTE) + 60);
cal.set(Calendar.SECOND, calendar.get(Calendar.SECOND));
cal.set(Calendar.MILLISECOND, calendar.get(Calendar.MILLISECOND));
cal.set(Calendar.DATE, calendar.get(Calendar.DATE));
cal.set(Calendar.MONTH, calendar.get(Calendar.MONTH));
// set alarm to start service again after receiving broadcast
AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(context, SyncAlarm.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_ONE_SHOT);
am.cancel(pendingIntent);
am.set(AlarmManager.RTC, cal.getTimeInMillis(), pendingIntent);
intent = new Intent(context, Reminder.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startService(intent);
}
}
开始你的广播接收器的第一次,当你启动应用程序:
start your broadcast receiver for the first time when you start your application:
AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(context, SyncAlarm.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_ONE_SHOT);
am.cancel(pendingIntent);
am.set(AlarmManager.RTC, System.currentTimeMillis(), pendingIntent);
另外添加到您的清单文件:
Also add this to your Manifest File:
<receiver android:name=".SyncAlarm" >
</receiver>
您也应该有alook在此 START_STICKY 如果你希望你的服务是由Android系统,一旦资源可用,而不是接收广播由AlarmManager启动。
You should also have alook at this START_STICKY if you want your service to be started by Android system as soon as resources are available instead of receiving Broadcast by AlarmManager.
上一篇:在Android的主机卡仿真编辑功能编辑、主机、功能、Android
下一篇:我该如何分割很长,单SQLiteOpenHelper为serveral的班,每个表很长、我该、serveral、SQLiteOpenHelper