我正在尝试运行一个进程计时器并让它在android的后台运行(单击按钮开始)。
计时器必须在30秒内,甚至应该在后台继续增加应用程序(主页按钮和电源/屏幕关闭)。
我该怎么做?我试过服务和处理程序,但没有工作...
修改
我的服务跟踪(30秒处理)
public class TrackingService extends IntentService {
private Handler mHandler;
private Runnable mRunnable;
public TrackingService() {
super("TrackingService");
}
public TrackingService(String name) {
super(name);
}
@Override
protected void onHandleIntent(Intent intent) {
long timer = 30000;
mHandler = new Handler();
mRunnable = new Runnable() {
@Override
public void run() {
//TODO - process with update timer for new 30 sec
mHandler.postDelayed(this, timer);
}
};
mHandler.postDelayed(mRunnable, timer);
}
}
我的点击按钮:
mButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//TODO - start first time and it continued every 30 seconds and continue in the background
startService(Intent intent = new Intent(this, TrackingService.class));
}
});
答案 0 :(得分:8)
好的,首先,我真的不知道我的问题是否正确。 但我认为你想要一个每30秒执行一次的计时器,如果我没有弄错的话。 如果是,请执行以下操作:
注意:此类提供对系统警报服务的访问。这些允许您安排应用程序在将来的某个时间运行。当闹钟响起时,系统会广播已为其注册的Intent,如果不已经在运行,则自动启动目标应用程序。当设备睡着时,会保留已注册的警报(如果设备在此期间关闭,则可以选择将设备唤醒),但如果设备关闭并重新启动,将被清除。强>
示例:强>
在您的onClick()
注册您的计时器:
int repeatTime = 30; //Repeat alarm time in seconds
AlarmManager processTimer = (AlarmManager)getSystemService(ALARM_SERVICE);
Intent intent = new Intent(this, processTimerReceiver.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
//Repeat alarm every second
processTimer.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(),repeatTime*1000, pendingIntent);
您的 processTimerReceiver类:
//This is called every second (depends on repeatTime)
public class processTimerReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
//Do something every 30 seconds
}
}
不要忘记在 Manifest.XML
中注册您的接收器<receiver android:name="processTimer" >
<intent-filter>
<action android:name="processTimerReceiver" >
</action>
</intent-filter>
</receiver>
如果您想取消闹钟: 用这个来做:
//Cancel the alarm
Intent intent = new Intent(this, processTimerReceiver.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, intent, 0);
AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
alarmManager.cancel(pendingIntent);
希望这可以帮助你。
PS:如果这不是您想要的,请将其留在评论中,或者如果有人想要编辑,请执行此操作。
答案 1 :(得分:1)
天啊,永远不要使用AlarmManager 30秒计时器。这有点过分,也会大大消耗设备资源(电池,CPU ......)。
也许您可以尝试使用真正的后台服务而不是IntentService,因为IntentService在失去工作时往往会自行关闭。不确定这是否是这种情况,但值得一试。