android上的后台进程计时器

android上的后台进程计时器,android,service,timer,Android,Service,Timer,我正在尝试运行一个进程计时器,并让它在android的后台运行(从点击按钮开始) 计时器必须开启30秒,甚至应该在后台继续增长应用程序(主页按钮和电源/屏幕关闭) 我该怎么做?我尝试了服务和处理程序,但没有工作 编辑 我的服务跟踪(处理时间为30秒) 我的单击按钮: mButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //T

我正在尝试运行一个进程计时器,并让它在android的后台运行(从点击按钮开始)

计时器必须开启30秒,甚至应该在后台继续增长应用程序(主页按钮和电源/屏幕关闭)

我该怎么做?我尝试了服务和处理程序,但没有工作

编辑

我的服务跟踪(处理时间为30秒)

我的单击按钮:

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));

    }
});

好的,首先,我真的不知道我是否完全理解你的问题。 但如果我没弄错的话,我想你需要一个每30秒执行一次的计时器。 如果是,请执行以下操作:

注意:此类提供对系统报警服务的访问。这些允许您安排应用程序在将来的某个时间运行。当报警熄灭时,系统会广播已登记的报警意图,如果目标应用程序未运行,则会自动启动该应用程序。当设备处于睡眠状态时,注册的报警会被保留(如果在此期间报警关闭,可以选择唤醒设备),但如果关闭并重新启动,则会清除。

示例:

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>
希望这对你有所帮助


PS:如果这不是你想要的,请在评论中留下它,或者如果有人想编辑它,请这样做。

哦,天哪,不要对30秒计时器使用AlarmManager。这是一种过度消耗,同时也极大地消耗了设备资源(电池、CPU…)


也许您可以尝试使用真正的后台服务,而不是IntentService,因为IntentService在用完时会自动关闭。不确定这里是否是这样,但值得一试。

欢迎来到StackOverflow!如果你正在寻找你的问题的答案,你应该首先考虑给我们你的方法,这样我们就可以帮助你理解你在做什么或做什么。你不能在断电设备上运行任何东西。除此之外,请检查
AlarmManager
和/或
JobScheduler
要记住的内容关于在后台运行的内容,Android操作系统保留在其认为必要时随时终止后台进程的权利。如果必须调用任务关键型计时器,您可能需要重新考虑您的方法。我同意,但他希望他的计时器无论如何都能继续运行,因此
AlarmManager
是最佳选择,请显示电池电量。要获得更好的答案,请阅读。是的,但是如果你需要在后台重复30秒计时器,即使应用程序没有运行,那么这是一个糟糕的应用程序设计。每隔30秒触发一次警报确实是一个糟糕的设计。没错,但我不知道我是否正确回答了他的问题。所以,也许这甚至不是他想要的。你对他的问题怎么看?我只想把他推向正确的方向,我知道他想要一个30秒的定时器来触发,即使应用程序在后台(不知道他说的关机是什么意思)。后台服务会一直这样做,直到操作系统因为资源不足(内存不足)而决定终止它。另外,这将是一个更好的解决方案,除非作者希望这里有完全不同的东西。@ZoranP你说这是一个糟糕的设计,但假设我必须几乎“实时”发送我的位置以获得一些基于的结果,该位置不会是静态的,那么最好的解决方案是什么?
<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);