在特定时间启动应用

时间:2010-12-15 16:49:56

标签: android task alarm

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

3 个答案:

答案 0 :(得分:18)

你可以用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));
   }
}

答案 1 :(得分:11)

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

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

答案 2 :(得分:1)

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

这是c& p:

Android AlarmManager教程 作者:Rakesh Cusat,2012年9月20日|提起: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)。

<linearlayout android:layout_height='match_parent' 
   android:layout_width='match_parent' android:orientation='vertical' 
   xmlns:android='http://schemas.android.com/apk/res/android' 
   xmlns:tools='http://schemas.android.com/tools'>

   <button android:id='@+id/btStart' android:layout_height='wrap_content' 
     android:layout_width='match_parent' android:onclick='startRepeatingTimer' 
     android:padding='@dimen/padding_medium' android:text='@string/btStart'   
     tools:context='.WidgetAlarmManagerActivity'/>
   <button android:id='@+id/btCancel' android:layout_height='wrap_content' 
     android:layout_width='match_parent' android:onclick='cancelRepeatingTimer'  
     android:padding='@dimen/padding_medium' android:text='@string/btCancel' 
     tools:context='.WidgetAlarmManagerActivity'/>
    <button android:id='@+id/btOneTime' android:layout_height='wrap_content' 
    android:layout_width='match_parent' android:onclick='onetimeTimer' 
    android:padding='@dimen/padding_medium' android:text='@string/btOneTime'   
    tools:context='.WidgetAlarmManagerActivity'/>
  </linearlayout>

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

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

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

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

警报类型 触发时间 未决意图

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已注册为广播接收器。

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

现在让我们定义定义一些方法的活动类。这些方法将处理按钮点击。在这个类中,我们创建一个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/