web-dev-qa-db-ja.com

特定の時間にアプリを起動する

目覚まし時計が特定の時間に鳴るような、特定の時間にアプリを起動することが可能であるかどうか(そしてそれがどのように行われるか)を考えていました。アプリを朝の8時に起動したいとします。それは可能ですか?

24
TiGer

あなたは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));
   }
}
20
ninjasense

おそらく AlarmManager を探しています。これにより、サービス/アクティビティを開始したり、特定の間隔または指定した時間にブロードキャストを送信したり、繰り返したりしないことができます。これは、Androidでメモリフレンドリーなバックグラウンドサービスを作成する方法です。 AlarmManagerは、UNIXのcronのようなものです。これにより、バックグラウンドサービスを開始し、その作業を行い、メモリを使い果たすことができます。

おそらく、アクティビティを開始したくないでしょう(それが「アプリケーション」によって意味されている場合)。何かが起こったことをユーザーに警告したい場合は、特定の時間にレシーバーを開始するアラームを追加し、レシーバーに通知を追加してもらいます。通知をクリックすると、アプリケーションを開くことができます。これは、潜在的に望ましくないアクティビティをフォアグラウンドに持ってくるよりも侵襲性が低くなります。

11

とても良いチュートリアルがあります: 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アプリケーションフレームワーク、およびインテントブロードキャストレシーバーの予備知識)。

AlarmManager:

AlarmManagerは、システムアラームサービスにアクセスできます。 AlarmManagerを利用して、将来のコードの実行をスケジュールできます。 AlarmManagerオブジェクトは直接インスタンス化できませんが、Context.getSystemService(Context.ALARM_SERVICE)を呼び出して取得できます。 AlarmManagerは常にインテントで登録されます。アラームが発生すると、AlarmManagerに登録されているIntentがシステムから自動的にブロードキャストされます。このインテントは、ターゲットアプリケーションが実行されていない場合にそれを起動します。アプリケーションが現在実行されていない場合でも、特定の時間にアプリケーションコードを実行する場合は、AlarmManagerを使用することをお勧めします。その他のタイミング操作は使いやすいのでハンドラーを使うべきです。ハンドラについては、他のチュートリアルで説明しています。

メソッド説明set()アラームを1回スケジュールします。 setInexactRepeating()不正確な繰り返しでアラームをスケジュールします。トリガー時間は厳密な制限に従っていません。 setRepeating()正確な繰り返し時間でアラームをスケジュールします。 setTime()システムのウォールクロック時間を設定します。 setTimeZone()システムのデフォルトのタイムゾーンを設定します。詳細については、AlarmManagerのドキュメントをご覧ください。

このチュートリアルでは、ワンタイムタイマーと繰り返しタイマーを作成し、繰り返しタイマーをキャンセルする方法を学びましょう。ここでは、タイマーとアラームは同じ意味で使用されていますが、このチュートリアルのコンテキストでは、どちらも同じ意味です。

コード例:

レイアウトファイルに、繰り返しタイマーの開始、繰り返しタイマーのキャンセル、およびワンタイムタイマーの3つのボタンを作成しましょう。これらのボタンには、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>

AlarmManagerに登録されたインテントを処理するBroadcastRecieverを定義します。指定されたクラスでは、onReceive()メソッドが定義されています。このメソッドは、インテントを受信するとすぐに呼び出されます。インテントを受け取ったら、このインテントに関連付けられている追加のパラメーターを取得しようとします。この追加パラメーターはユーザー定義、つまりONE_TIMEであり、基本的に、このインテントがワンタイムタイマーに関連付けられていたか、繰り返しタイマーに関連付けられていたかを示します。 ONE_TIMEパラメータ値が抽出されると、それに応じてToastメッセージが表示されます。ヘルパーメソッドも定義されており、setAlarm()、cancelAlarm()、onetimeTimer()などのオブジェクトを使用して他の場所から使用できます。これらのメソッドは、タイマーの操作を行うために他の場所で定義することもできます。つまり、設定、キャンセルなどです。このチュートリアルをシンプルに保つために、BroadcastReceiverで定義しました。

setAlarm():このメソッドは、setRepeating()メソッドを使用して繰り返しアラームを設定します。 setRepeating()メソッドには4つの引数が必要です。

アラームのタイプ、トリガー時間:現在の時間間隔(ミリ秒単位)に設定します。この例では、5秒(1000 * 5ミリ秒)のペンディングインテントを渡しています。このアラームに登録されます。アラームがトリガーされると、pendingIntentがブロードキャストされます。 cancelAlarm():このメソッドは、cancel()メソッドを呼び出すことにより、以前に登録されたアラームをキャンセルします。 cancel()メソッドは、pendingIntentを引数として取ります。 pendingIntentは1つに一致している必要があります。そうしないと、cancel()メソッドがシステムからアラームを削除できません。

onetimeTimer():このメソッドは、1回限りのアラームを作成します。これは、set()メソッドを呼び出すことで実現できます。 set()メソッドは3つの引数を取ります。

アラームトリガーのタイプ保留中のインテント

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

以下はマニフェストファイルです。ここでは、AlarmManagerBroadcastReceiverクラスにあるonReceive()メソッドで処理中にウェイクロックが使用されているため、WAKE_LOCK権限が必要です。 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>

次に、いくつかのメソッドを定義するアクティビティクラスを定義します。これらのメソッドはボタンのクリックを処理します。このクラスでは、setAlarm()、cancelAlarm()、およびsetOnetime()へのアクセスに役立つAlarmManagerBroadcastRecieverのインスタンスを作成します。残りのコードは簡単に理解できます。

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 をダウンロードしてください。

リファレンス:Androidのチュートリアル、Code4ReferenceブログのJCGパートナーRakesh CusatによるAlarmManager。

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

1