2012-01-06 5 views
5

一部のAndroidアプリケーションでは、次の機能を統合したいと考えています。 ユーザーは何かを思い出させる時間を定義できます。時間が来たら、アプリケーションはこの時点でユーザーがアプリケーションを使用していなくても、通知バーに通知を作成する必要があります。Androidの予定通知(イベントなど)を作成する

この目的のために、AlarmManager、NotificationManager、Notification.Builderのクラスは見ていますか?

私はどのようにして事前通知を作成しますか?

public class AlarmNotificationReceiver extends BroadcastReceiver { 

    public void onReceive(Context context, Intent intent) { 
     Bundle extras = intent.getExtras(); 
     if (extras != null) { 
      String additionalData = extras.getString("displayText"); 
      // show the notification now 
      NotificationManager mNotificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); 
      Notification mNotification = new Notification(R.drawable.ic_launcher, context.getString(R.string.app_name), System.currentTimeMillis()); 
      PendingIntent pi = PendingIntent.getActivity(context, 0, new Intent(context, MainActivity.class), 0); // open MainActivity if the user selects this notification 
      mNotification.setLatestEventInfo(context, context.getString(R.string.app_name), additionalData, pi); 
      mNotification.flags |= Notification.FLAG_AUTO_CANCEL | Notification.DEFAULT_SOUND; 
      mNotificationManager.notify(1, mNotification); 
     } 
    } 

} 

<receiver android:name="AlarmNotificationReceiver"></receiver> 

は、受信したアラームを処理する新しいクラスファイルを作成します。

放送受信機を登録するAndroidManifestに下にこれを追加します。私のコードは(今のところ)これは

は今から3秒にアラームを設定する(MainActivity中など)、このコードを使用します。

Intent i = new Intent(this, AlarmNotificationReceiver.class); 
    i.putExtra("displayText", "sample text"); 
    PendingIntent pi = PendingIntent.getBroadcast(this.getApplicationContext(), 234324246, i, 0); 
    AlarmManager mAlarm = (AlarmManager) getApplicationContext().getSystemService(Context.ALARM_SERVICE); 
    mAlarm.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis()+3*1000, pi); 

この作品を制作するためには何を変更する必要がありますか?ありがとうございました!

二つの問題がある:私はコードでそれを変更したとき

  1. 通知のテキストは変更されません。 PendingIntent.getBroadcast(...)でrequestCodeを変更した場合のみ変更されます。このリクエストコードはどういう意味ですか?ランダムな値か0か
  2. 私の電話機をリブートした後、「計画された」通知またはアラームは消えました。しかし今、私はこれが正常な動作であることを見ました。どうすればこれを回避できますか?
+1

これまでのところ何がうまくいかないのですか? –

答えて

4

パート1についてはわかりませんが、パート2の場合、一般的なアプローチはBOOT_COMPLETEDインテントをインターセプトし、それを使用してすべてのアラームを再登録することです。これは残念なことに、あなたがアラームマネージャーに登録したアラームごとに、アプリのDBにもそれを保存する必要があります。

だから、あなたはBOOT_COMPLETEDが意図傍受する放送受信機が必要になります:

public class BootReceiver extends BroadcastReceiver { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     // get your stored alarms from your database 
     // reregister them with the alarm manager 
    } 
} 

BOOT_COMPLETEDが意図取得するには、あなたがあなたのマニフェストに次の権限を置く必要があります。

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> 

そして、次のインテントフィルタを使用してマニフェストにBootReceiverを登録する必要があります。

<receiver android:enabled="true" android:name=".receiver.BootReceiver" 
    android:permission="android.permission.RECEIVE_BOOT_COMPLETED"> 
     <intent-filter> 
       <action android:name="android.intent.action.BOOT_COMPLETED" /> 
       <category android:name="android.intent.category.DEFAULT" /> 
     </intent-filter> 
    </receiver> 

あなたのアプリがsdcardにインストールされている場合は、BOOT_COMPLETEDインテントを受け取ることができないことに注意することが重要です。また、起動時にコードをすぐに実行し、起動時にユーザーの電話を遅くするという点で、この実装は少し面白くないことに注意してください。だから、私はブートインテントをインターセプトしてから数分遅らせることをお勧めします。

+0

ありがとうございました!実際にこれを行う方法は他にありませんか?これはちょっと複雑すぎるように聞こえる。追加のアクセス権が必要であり、それらの登録アクションを実行します。とにかく、アプリケーションごとのアラームの数は制限されていませんか?私はすべてのアプリケーションが1つのアラームを登録することが許可されていると思うし、前のものは上書きされます。これは通知のルールですか? – caw

+0

残念ながら、これを行う方法は他にありません。通知の制限についてはわかりませんが、問題なしで複数のアラームを登録できることは確かです。 – danh32

+0

ここで説明した内容を実行する必要があります。これらのアラームのIDを保存する必要はありますか?または、新しいアラームを保存せずに作成することはできますか? – caw

1

私は個人的には放送受信機なしでそれを行います。私は、Receiverではなく、別々のActivityを開始する意図を発生させるためにAlarmManagerを取得します。次に、この新しいアクティビティによって通知が行われます。これがより良い方法であるかどうかはわかりませんが、それほど複雑ではありません。

編集:サービスは、おそらくあなたのMainActivityの活動

より良いまだ、次のようになります。

Intent i = new Intent(getBaseContext(), NotificationService.class); 
PendingIntent pi = PendingIntent.getService(getBaseContext(), 0, i, 0); 
AlarmManager mAlarm = (AlarmManager) Context.getSystemService(Context.ALARM_SERVICE); 
mAlarm.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis()+10*60*1000, pi); 

あなたのサービス:

public class NotificationService extends Service { 

public int onStartCommand(Intent intent, int flags, int startId) { 

//Create the notification here 

return START_NOT_STICKY; 
} 

マニフェスト:

<service android:name="com.android.yourpath.NotificationService"></service> 
+0

ありがとう!なぜブロードキャストを使うよりもサービスを使う方が良いのか説明できますか?私は、アラームを含むいくつかのページで放送の例を見つけました。 – caw

+0

それは本当に個人的な好みです。ブロードキャストを実行するようにアラームを設定するのではなく、ブロードキャストを受信して​​アクションを実行するのではなく、特定の時刻にサービスを実行するようにアラームを設定するだけなので、サービスはより簡単な方法です。私は、ブロードキャストメソッドを動作させるためのカスタムインテントを記述する必要があると思います。 –

+0

ああ、大丈夫です。しかし、ドキュメンテーションによれば、サービスは長年にわたるバックグラウンドタスクのためのものです。だから私はむしろ放送を使うべきだと思った。そして、この質問(http://stackoverflow.com/questions/1026973/android-whats-the-difference-between-the-various-methods-to-get-a-context)では、彼らはgetBaseContext ();) – caw

関連する問題