2011-06-25 13 views
3

Androidで予定リマインダーを設定する最も良い方法は何ですか?私は、AlarmManagerより優れたものがあることを願っています。Androidで予約通知を作成する最も良い方法は何ですか?

あなたは、次の歯科の予定(または任意の予定 - それは問題ではありませんが、1年に1つまたは2つの予定があると仮定して)を思い出させることができます。その予定に近づくにつれて通知がポップアップされ、アプリが実行されていなくても(電話がオンになっていると仮定して)機能します。

AlarmManagerでも可能ですが、デバイスを再起動するたびに再起動する必要があります。これは3つの理由のために醜いです: -

  1. アプリは(APP2SDサポートを提供していないアプリケーションを炎になり、多くのユーザー)SDカードにインストールされている場合、それは動作しません。

  2. リマインダが保存されていない場合、サービスは起動時にそれを検出するために実行する必要があります。私の知る限りでは、BOOT_COMPLETEDリスナを必要なときにのみプログラムでセットアップすることは不可能です。

  3. ブートアップ時にこれらのタイプのサービスで電話機が故障することを望んでいる人はいません。

誰かがより良い解決策を知っていたのですか?私はちょうど長期任命を保存したい。好ましくはGoogleカレンダーなどへのアクセスに頼ることなく内部Androidサービスを使用すること。何か案は?

答えて

5

正しい解決策はAlarmManagerです。起動時に起動するかどうかは、PackageManager.setComponentEnabledSetting()を使用してプログラマチックに変更して、アラームがスケジュールされている場合にのみ受信コンポーネントを有効にすることができます。

実際には、大部分のアプリが起動後にアラームを再評価する必要があるため、AlarmManagerは起動中のアラームを保持しません。例えば、カレンダーはそれらを再同期する必要があります。そして、それらを保持することは大きな欠点があります:アプリケーションのバグは、再起動してもクリアされないアラームマネージャーに迷惑データを残す可能性があります。

SDカードについては、http://developer.android.com/reference/android/content/Intent.html#ACTION_EXTERNAL_APPLICATIONS_AVAILABLEを見ると、外部ストレージがいつ再マウントされ、アプリが再び実行できるかを知ることができます。

+0

多くのおかげでDianne、私は本当に答える時間を割いていただきありがとうございます。私は、なぜ再起動時にAlarmManagerがクリアされるのかをよりよく理解してくれました。私はAlarmManagerに固執するつもりですが、今私はこれがこの作業に適していると確信しています。私は、ブートマネージャが必要でないときに、正しい方法でブートマネージャを無効にするために、PackageManagerを使用するつもりです。 External_Apps_Availableをリッスンすると、Boot_Completedイベントを見逃したapp2sdユーザーのためにAlarmManagerをセットアップできます。だからそれはすべて見栄えがいい。もう一度ありがとう。 – Falken

1

BOOT_COMPLETEDインテントの代替手段は実際にはありません.SDの問題はおそらく変更されません。この機能が必要な場合は、無知なユーザーと一緒に暮らす必要があります。まともな仕事をしても、ブートレシーバーはデバイスを大幅に遅くすることはありません。

SMSリスナーが1つの選択肢となり、必要な時間にトリガー情報を含むSMSを送信することができます。ブートレシーバーは必要ありません。予定がない場合はアクティビティーがありません。 SMS放送受信機のところまでいくら侵入しても、あなたは選択肢に恵まれていません。同様の方法でC2DMを使用することもできますが、これらのオプション(SMSまたはC2DM)のいずれかでは、サーバー側のインフラストラクチャ(つまりmoeなし)を大幅に必要とします。

SDに関する限り、実際の解決策は、デバイスメーカーがiphoneの機能を実行し、各デバイスでは削除できない比較的大量のフラッシュを入れることです:SDの狂気はかなりです率直に言うと、私は、4GBの小売価格で4GBのSDフラッシュを購入することができます。デバイスベンダーや通信事業者にとって優れたユーザーエクスペリエンスを提供するには高価すぎると、ビジネスを失うことになります。

+0

多くのありがとうFemi。私はC2DMオプションに誘惑されていますが、それはAndroid 2.2以降でしか利用できません。バージョン1.5に戻ってサポートする必要があります。 SMSは私にとって高価すぎるでしょう。ですから、今はAlarmManagerに固執するつもりですが、私は本当に代わりのアイデアに感謝します。私はSDカードの問題についてあなたに完全に同意します。デバイスの大部分がより良い内部ストレージを持つのを待つことができないので、現在のSDの狂気は消え去ります。 – Falken

0

リマインダが保存されていない場合、サービスは起動時にそれを検出するために実行する必要があります。私の知る限りでは、BOOT_COMPLETEDリスナを必要なときにのみプログラムでセットアップすることは不可能です。

もあります。 PackageManagerを使用してコンポーネントを無効にして、必要なときに有効にします。

SharedPreferences.OnSharedPreferenceChangeListener onChange= 
    new SharedPreferences.OnSharedPreferenceChangeListener() { 
    public void onSharedPreferenceChanged(SharedPreferences prefs, String key) { 
     if ("alarm".equals(key)) { 
      boolean enabled=prefs.getBoolean(key, false); 
      int flag=(enabled ? 
         PackageManager.COMPONENT_ENABLED_STATE_ENABLED : 
         PackageManager.COMPONENT_ENABLED_STATE_DISABLED); 
      ComponentName component=new ComponentName(EditPreferences.this, 
                 OnBootReceiver.class); 

      getPackageManager() 
       .setComponentEnabledSetting(component, flag, 
              PackageManager.DONT_KILL_APP); 

      if (enabled) { 
       OnBootReceiver.setAlarm(EditPreferences.this); 
      } 
      else { 
       OnBootReceiver.cancelAlarm(EditPreferences.this); 
      } 
     } 
     else if ("alarm_time".equals(key)) { 
      OnBootReceiver.cancelAlarm(EditPreferences.this); 
      OnBootReceiver.setAlarm(EditPreferences.this); 
     } 
    } 
}; 

誰もが自分の携帯電話は、この種のサービスで行き詰まることを望んでいない:例えば、ここで有効/ユーザが「アラーム」CheckBoxPreferenceをチェックするかどうかに基づいて、起動時の受信機を無効OnSharedPreferenceChangeListenerです起動時に。

最近のテストでは、OSの束を含め、従来のAndroid搭載端末に数十億のリスナーがあることが判明しました。私はそれが実装するのが難しいわけではないので、それが必要でない場合、コンポーネントを無効にするのが良い形式であることに同意します。しかし、それが本当に必要な時には心配しません。

+0

多くのありがとうMark。プログラムで無効にすることができます。私は間違いなく、配線されていると仮定していました。なぜなら、私はそれをマニフェストで宣言していたからですが、あなたは私がPackageManagerを介して引き続き無効にできることを認識させました。 Androidドメインの書籍、教材、知識を真に価値あるものにするため、時間を割いていただきありがとうございます。 – Falken

関連する問題