24

特定の時間にアプリを起動することが可能かどうか (およびその方法があるかどうか)、特定の時間に鳴る目覚まし時計のようなものかどうか疑問に思っていました。アプリを朝 8 時に起動させたいとしましょう。それは実現可能ですか?

4

3 に答える 3

21

これは 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));
   }
}
于 2010-12-15T19:36:43.123 に答える
11

あなたはおそらくAlarmManagerを探しています。これにより、サービス/アクティビティを開始したり、特定の間隔または特定の時間にブロードキャストを送信したりできます。繰り返すかどうかは関係ありません。これは、Android でメモリに優しいバックグラウンド サービスを作成する方法です。AlarmManagerUNIX の cron のようなものです。これにより、バックグラウンド サービスを開始し、その作業を実行し、メモリ不足に陥ることができます。

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

于 2010-12-15T19:27:07.897 に答える
1

非常に優れたチュートリアルがあります: http://www.javacodegeeks.com/2012/09/android-alarmmanager-tutorial.html

ここにc&pがあります:

2012 年 9 月 20 日の Rakesh Cusat による Android AlarmManager チュートリアル | に提出: Android コア

アプリケーションの作成中に、将来のコードの実行をスケジュールする必要が生じます。指定した時間に作業をスケジュールするために、AlarmManager が必要になる場合があります。AlarmManager はシステム アラームにアクセスし、アプリケーションが実行されていないときでもコードの実行をスケジュールします。プロジェクト情報: プロジェクトに関するメタ情報。プラットフォームのバージョン: Android API レベル 10. IDE: Eclipse Helios Service Release 2 エミュレーター: Android 4.1

前提条件: Android アプリケーション フレームワークとインテント ブロードキャスト レシーバーに関する予備知識。

アラームマネージャー:

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 であり、基本的に、このインテントが 1 回限りのタイマーに関連付けられているか、繰り返しのタイマーに関連付けられているかを示します。ONE_TIME パラメータ値が抽出されると、それに応じてトースト メッセージが表示されます。ヘルパー メソッドも定義されており、オブジェクト (setAlarm()、cancelAlarm()、および onetimeTimer() メソッド) を使用して他の場所から使用できます。これらのメソッドは、タイマーで操作を行うために別の場所で定義することもできます。つまり、set、cancel などです。このチュートリアルを簡単にするために、

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

参照: Code4Reference ブログの JCG パートナー Rakesh Cusat による Android AlarmManager のチュートリアル。

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

于 2014-01-22T20:07:24.037 に答える