在特定时间启动应用

我想知道是否有可能(以及如何)在特定时间启动我的应用程序,就像闹钟在特定时间熄灭。 假设我希望我的应用程序在早上8点启动,这是可行的吗?

你可以用AlarmManager来做,这是一个简短的例子。 首先,您需要设置警报:

AlarmManager am = (AlarmManager) con.getSystemService(Context.ALARM_SERVICE); Date futureDate = new Date(new Date().getTime() + 86400000); futureDate.setHours(8); futureDate.setMinutes(0); futureDate.setSeconds(0); Intent intent = new Intent(con, MyAppReciever.class); PendingIntent sender = PendingIntent.getBroadcast(con, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); am.set(AlarmManager.RTC_WAKEUP, futureDate.getTimeInMillis(), sender); 

接下来,您需要创建一个带有一些代码的接收器来执行您的应用程序:(即启动您的应用程序):

 public class MyAppReciever extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { startActivity(new Intent(context, MyAppMainActivity.class)); } } 

您可能正在寻找AlarmManager ,它允许您以特定间隔或给定时间开始服务/活动/发送广播,重复与否。 这就是你如何在android中编写内存友好的后台服务。 AlarmManager有点像unix中的cron。 它允许您的后台服务启动,执行其工作,并使内存不足。

您可能不想开始一项活动(如果这就是“应用程序”的意思)。 如果要提醒用户发生了某些事情,请添加在给定时间启动接收器的警报,并让接收者添加通知。 通知可以在单击时打开应用程序。 这比将一些可能不需要的活动带到前台的侵入性要小。

有一个非常好的教程: http : //www.javacodegeeks.com/2012/09/android-alarmmanager-tutorial.html

这是c&p:

2012年9月20日Rakesh Cusat的Android AlarmManager教程| 提起:Android Core

在编写应用程序时,需要在将来安排代码的执行。 您可能需要AlarmManager在指定时间安排工作。 即使应用程序未运行,AlarmManager也会访问系统警报并安排代码执行。 项目信息:有关项目的元信息。 平台版本:Android API级别10. IDE:Eclipse Helios Service Release 2仿真器:Android 4.1

先决条件:Android应用程序框架和Intent Broadcast接收器的初步知识。

AlarmManager:

AlarmManager可以访问系统警报服务。 在AlarmManager的帮助下,您可以安排将来执行代码。 AlarmManager对象无法直接实例化,但可以通过调用Context.getSystemService(Context.ALARM_SERVICE)来检索它。 AlarmManager始终按意图注册。 当闹钟响起时,系统会自动播放已向AlarmManager注册的Intent。 如果目标应用程序未运行,则此目标将启动它。 如果希望在特定时间运行应用程序代码,建议使用AlarmManager,即使您的应用程序当前未运行也是如此。 对于其他计时操作,应该使用处理程序,因为它易于使用。 Handler在其他教程中介绍。

方法说明set()计划一次警报。 setInexactRepeating()以不精确的重复计划警报。 触发时间不受任何严格限制。 setRepeating()以精确的重复时间计划警报。 setTime()设置系统的挂钟时间。 setTimeZone()设置系统的默认时区。 查看AlarmManager文档以获取更多信息。

在本教程中,让我们学习创建一次性计时器和重复计时器,以及取消重复计时器。 这里定时器和报警器可以互换使用,但在本教程中,它们都具有相同的含义。

示例代码:

让我们创建三个按钮开始重复计时器,取消重复计时器和布局文件中的一次性计时器。 这些按钮附带了方法,例如startRepeatingTimer,cancelRepeatingTimer和onetimeTimer。 这些方法将在Activity类中定义。 布局文件如下所示(activity_alarm_manager.xml)。

      

我们将定义BroadcastReciever,它处理AlarmManager注册的意图。 在给定的类中定义了onReceive()方法。 一旦收到意图,就会调用此方法。 一旦我们收到意图,我们就会尝试获得与此意图相关的额外参数。 该额外参数是用户定义的,即ONE_TIME,基本上指示该意图是与一次性计时器还是重复计时器相关联。 一旦提取了ONE_TIME参数值,就会相应地显示Toast消息。 还定义了辅助方法,可以在对象的帮助下从其他地方使用,即setAlarm(),cancelAlarm()和onetimeTimer()方法。 这些方法也可以在其他地方定义,以便对定时器进行操作,即设置,取消等。为了使本教程简单,我们在BroadcastReceiver中定义了它。

setAlarm():此方法使用setRepeating()方法设置重复警报。 setRepeating()方法需要四个参数:

警报types,触发时间:将其设置为当前时间间隔(以毫秒为单位):在此示例中,我们传递5秒(1000 * 5毫秒)待处理意图:它将在此警报中注册。 当警报被触发时,将广播pendingIntent。 cancelAlarm():此方法通过调用cancel()方法取消先前注册的警报。 cancel()方法将pendingIntent作为参数。 pendingIntent应该匹配一个,只有那时cancel()方法才能从系统中删除警报。

onetimeTimer():此方法创建一次性警报。 这可以通过调用set()方法来实现。 set()方法有三个参数:

警报types触发时间待定意图

 package com.rakesh.alarmmanagerexample; import java.text.Format; import java.text.SimpleDateFormat; import java.util.Date; import android.app.AlarmManager; import android.app.PendingIntent; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.os.PowerManager; import android.widget.Toast; public class AlarmManagerBroadcastReceiver extends BroadcastReceiver { final public static String ONE_TIME = 'onetime'; @Override public void onReceive(Context context, Intent intent) { PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE); PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, 'YOUR TAG'); //Acquire the lock wl.acquire(); //You can do the processing here. Bundle extras = intent.getExtras(); StringBuilder msgStr = new StringBuilder(); if(extras != null && extras.getBoolean(ONE_TIME, Boolean.FALSE)){ //Make sure this intent has been sent by the one-time timer button. msgStr.append('One time Timer : '); } Format formatter = new SimpleDateFormat('hh:mm:ss a'); msgStr.append(formatter.format(new Date())); Toast.makeText(context, msgStr, Toast.LENGTH_LONG).show(); //Release the lock wl.release(); } public void SetAlarm(Context context) { AlarmManager am=(AlarmManager)context.getSystemService(Context.ALARM_SERVICE); Intent intent = new Intent(context, AlarmManagerBroadcastReceiver.class); intent.putExtra(ONE_TIME, Boolean.FALSE); PendingIntent pi = PendingIntent.getBroadcast(context, 0, intent, 0); //After after 5 seconds am.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), 1000 * 5 , pi); } public void CancelAlarm(Context context) { Intent intent = new Intent(context, AlarmManagerBroadcastReceiver.class); PendingIntent sender = PendingIntent.getBroadcast(context, 0, intent, 0); AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); alarmManager.cancel(sender); } public void setOnetimeTimer(Context context){ AlarmManager am=(AlarmManager)context.getSystemService(Context.ALARM_SERVICE); Intent intent = new Intent(context, AlarmManagerBroadcastReceiver.class); intent.putExtra(ONE_TIME, Boolean.TRUE); PendingIntent pi = PendingIntent.getBroadcast(context, 0, intent, 0); am.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), pi); } } 

下面给出的是清单文件。 这里,WAKE_LOCK权限是必需的,因为在处理AlarmManagerBroadcastReceiver类中的onReceive()方法时正在使用唤醒锁。 AlarmManagerBroadcastReceiver已注册为广播接收器。

               

现在让我们定义定义一些方法的活动类。 这些方法将处理按钮点击。 在这个类中,我们创建一个AlarmManagerBroadcastReciever实例,它将帮助我们访问setAlarm(),cancelAlarm()和setOnetime()。 其余的代码很容易理解。

 package com.rakesh.alarmmanagerexample; import com.rakesh.alarmmanagerexample.R; import android.os.Bundle; import android.app.Activity; import android.content.Context; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.Toast; import android.support.v4.app.NavUtils; public class AlarmManagerActivity extends Activity { private AlarmManagerBroadcastReceiver alarm; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_alarm_manager); alarm = new AlarmManagerBroadcastReceiver(); } @Override protected void onStart() { super.onStart(); } public void startRepeatingTimer(View view) { Context context = this.getApplicationContext(); if(alarm != null){ alarm.SetAlarm(context); }else{ Toast.makeText(context, 'Alarm is null', Toast.LENGTH_SHORT).show(); } } public void cancelRepeatingTimer(View view){ Context context = this.getApplicationContext(); if(alarm != null){ alarm.CancelAlarm(context); }else{ Toast.makeText(context, 'Alarm is null', Toast.LENGTH_SHORT).show(); } } public void onetimeTimer(View view){ Context context = this.getApplicationContext(); if(alarm != null){ alarm.setOnetimeTimer(context); }else{ Toast.makeText(context, 'Alarm is null', Toast.LENGTH_SHORT).show(); } } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.activity_widget_alarm_manager, menu); return true; } } 

完成编码后,只需执行项目,您就会发现在模拟器中运行的类似应用程序。

如果您需要参考代码,请下载https://github.com/rakeshcusat/Code4Reference/tree/master/AndroidProjects/AlarmManagerExamplecode 。

参考:我们的JCG合作伙伴Rakesh Cusat在Code4Reference博客上的Android AlarmManager教程。

http://code4reference.com/2012/07/tutorial-on-android-alarmmanager/