Android 在特定时间启动应用程序
我想知道是否有可能(以及如何)在特定时间启动我的应用程序,比如在特定时间发出警报的闹钟。Android 在特定时间启动应用程序,android,task,alarm,Android,Task,Alarm,我想知道是否有可能(以及如何)在特定时间启动我的应用程序,比如在特定时间发出警报的闹钟。 比如说,我希望我的应用程序在早上8点启动,这可行吗?你可能正在寻找,让你在特定的时间间隔或给定的时间启动服务/活动/发送广播,重复或不重复。这就是在android中编写内存友好型后台服务的方法AlarmManager有点像unix中的cron。它允许您的后台服务启动、工作并释放内存 您可能不想启动一个活动(如果这就是您所说的“应用程序”)。如果要提醒用户发生了什么,请添加一个在给定时间启动接收器的警报,并让
比如说,我希望我的应用程序在早上8点启动,这可行吗?你可能正在寻找,让你在特定的时间间隔或给定的时间启动服务/活动/发送广播,重复或不重复。这就是在android中编写内存友好型后台服务的方法
AlarmManager
有点像unix中的cron。它允许您的后台服务启动、工作并释放内存
您可能不想启动一个活动(如果这就是您所说的“应用程序”)。如果要提醒用户发生了什么,请添加一个在给定时间启动接收器的警报,并让接收器添加一个通知。单击时,通知可以打开应用程序。这比将一些可能不需要的活动带到前台的侵入性小。您可以使用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);
接下来,您需要创建一个带有一些代码的接收器来执行您的应用程序:(即启动您的应用程序):
有一个非常好的教程: 以下是c&p: Android AlarmManager教程 Rakesh Cusat于2012年9月20日提交:Android Core 在编写应用程序时,需要计划将来代码的执行。您可以要求AlarmManager在指定时间安排您的工作。AlarmManager访问系统报警并计划代码的执行,即使应用程序未运行。 项目信息:关于项目的元信息。平台版本:Android API 10级。 IDE:EclipseHelios服务版本2 仿真器:安卓4.1 先决条件:具备Android应用程序框架的初步知识,并具备广播接收器的意图
<manifest android:versioncode='1' android:versionname='1.0'
package='com.rakesh.alarmmanagerexample'
xmlns:android='http://schemas.android.com/apk/res/android'>
<uses-sdk android:minsdkversion='10' android:targetsdkversion='15'/>
<uses-permission android:name='android.permission.WAKE_LOCK'/>
<application android:icon='@drawable/ic_launcher'
android:label='@string/app_name' android:theme='@style/AppTheme'>
<activity android:label='@string/title_activity_alarm_manager'
android:name='com.rakesh.alarmmanagerexample.AlarmManagerActivity'>
<intent-filter>
<action android:name='android.intent.action.MAIN'/>
<category android:name='android.intent.category.LAUNCHER' />
</intent-filter>
</activity>
<receiver android:name='com.rakesh.alarmmanagerexample.AlarmManagerBroadcastReceiver'>
</receiver>
</application>
</manifest>
AlarmManager:
AlarmManager可以访问系统报警服务。在AlarmManager的帮助下,您可以计划将来代码的执行。AlarmManager对象不能直接实例化,但是可以通过调用Context.getSystemService(Context.ALARM\u服务)检索它。AlarmManager始终以intent注册。当警报响起时,系统会自动广播已向AlarmManager注册的意图。如果目标应用程序未运行,则此意图会启动该应用程序。如果希望在特定时间运行应用程序代码,建议使用AlarmManager,即使应用程序当前未运行。对于其他计时操作,应使用处理器,因为它易于使用。处理程序将在其他教程中介绍
方法描述
set()为警报安排一次时间。
setInexactRepeating()调度具有不精确重复的报警。触发时间不受任何严格限制。
setRepeating()以精确的重复时间安排报警。
setTime()设置系统的挂钟时间。
setTimeZone()设置系统的默认时区。
查看AlarmManager文档了解更多信息
在本教程中,让我们学习创建一次性计时器和重复计时器,以及取消重复计时器。在这里,计时器和警报可以互换使用,但在本教程上下文中,两者的含义相同
示例代码:
让我们在布局文件中创建三个按钮:开始重复计时器、取消重复计时器和一次性计时器。这些按钮分别带有开始重复计时器、取消重复计时器和一次计时器等方法。这些方法将在Activity类中定义。布局文件如下所示(activity\u alarm\u manager.xml)
下面给出的是清单文件。这里需要WAKE_LOCK权限,因为在AlarmManagerBroadcastReceiver类中的onReceive()方法中处理时正在使用WAKE锁。AlarmManagerBroadcastReceiver已注册为广播接收器
<manifest android:versioncode='1' android:versionname='1.0'
package='com.rakesh.alarmmanagerexample'
xmlns:android='http://schemas.android.com/apk/res/android'>
<uses-sdk android:minsdkversion='10' android:targetsdkversion='15'/>
<uses-permission android:name='android.permission.WAKE_LOCK'/>
<application android:icon='@drawable/ic_launcher'
android:label='@string/app_name' android:theme='@style/AppTheme'>
<activity android:label='@string/title_activity_alarm_manager'
android:name='com.rakesh.alarmmanagerexample.AlarmManagerActivity'>
<intent-filter>
<action android:name='android.intent.action.MAIN'/>
<category android:name='android.intent.category.LAUNCHER' />
</intent-filter>
</activity>
<receiver android:name='com.rakesh.alarmmanagerexample.AlarmManagerBroadcastReceiver'>
</receiver>
</application>
</manifest>
完成编码后,只需执行项目,您就会发现类似的应用程序正在模拟器中运行
如果您需要参考代码,请下载
参考:我们的JCG合作伙伴Rakesh Cusat在Code4Reference博客上提供了关于Android AlarmManager的教程
事实上,我确实想运行我的主要活动:D我知道你的方法没有那么侵入性,但我也想做一些侵入性的事情:我认为缺少了一些东西:am.set(AlarmManager.RTC_WAKEUP,futureDate.getTimeInMillis(),sender);传递给AlarmManager的毫秒是1970年以来的毫秒,而不是现在的时差。我把这一点弄糊涂了,这就是为什么警报会立即触发(因为它似乎是在过去)。这个答案包含很多错误。这是一个对我有效的解决方案:不工作,不能启动这样的活动闹钟的来源-许多闹钟程序(如alarm clock Plus)包括在特定时间启动程序的功能,如果你想让另一个程序帮你完成繁重的工作,也可以通过应用程序按计划启动应用程序。可以设置计时器,您选择的应用程序将在特定时间启动。
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);
}
}
<manifest android:versioncode='1' android:versionname='1.0'
package='com.rakesh.alarmmanagerexample'
xmlns:android='http://schemas.android.com/apk/res/android'>
<uses-sdk android:minsdkversion='10' android:targetsdkversion='15'/>
<uses-permission android:name='android.permission.WAKE_LOCK'/>
<application android:icon='@drawable/ic_launcher'
android:label='@string/app_name' android:theme='@style/AppTheme'>
<activity android:label='@string/title_activity_alarm_manager'
android:name='com.rakesh.alarmmanagerexample.AlarmManagerActivity'>
<intent-filter>
<action android:name='android.intent.action.MAIN'/>
<category android:name='android.intent.category.LAUNCHER' />
</intent-filter>
</activity>
<receiver android:name='com.rakesh.alarmmanagerexample.AlarmManagerBroadcastReceiver'>
</receiver>
</application>
</manifest>
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;
}
}