android上的后台进程计时器

时间:2016-02-23 13:14:44

标签: android service timer

我正在尝试运行一个进程计时器并让它在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));

    }
});

2 个答案:

答案 0 :(得分:8)

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

  

AlarmManager

     

注意:此类提供对系统警报服务的访问。这些允许您安排应用程序在将来的某个时间运行。当闹钟响起时,系统会广播已为其注册的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在失去工作时往往会自行关闭。不确定这是否是这种情况,但值得一试。