Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/224.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 在特定时间启动应用程序_Android_Task_Alarm - Fatal编程技术网

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