3

編集マニフェストにこの行を追加すると、問題が解決しました(Serviceよく作成されています)。

<service android:name=".TimersService" >

役職

現在、カウントダウンが終了したことをユーザーに通知するアラームを実装しようとしています。createAlarm()を介して新しいアラームを追加するメソッドがありAlarmManagerます。このメソッドは現在、フラグメント内で呼び出されています。次のようになります。

private final void createAlarm(String name, long milliInFuture) {

        Intent myIntent = new Intent(getActivity().getApplication(),
                TimersService.class);

        AlarmManager alarmManager = (AlarmManager) getActivity()
                .getSystemService(Context.ALARM_SERVICE);

        PendingIntent pendingIntent = PendingIntent.getService(getActivity()
                .getApplication(), 0, myIntent, PendingIntent.FLAG_CANCEL_CURRENT);

        alarmManager.set(AlarmManager.RTC_WAKEUP,
                milliInFuture, pendingIntent); 

    }

このメソッドがアラームを追加することを期待しています。デバイスがスリープ モードの場合でも、Alarm を呼び出す必要があります。ある時点で呼び出す必要がありますmilliInFuture(これはSystem.currentTimeMillis()+ ある時点です)。アラームが鳴ったら、サービスを開始する必要があります。本サービスは以下のとおりです。これServiceでできることは 1 つだけです。アラームが終了したことをユーザーに通知することです。私Serviceのクラスは次のとおりです。

public class TimersService extends Service {

    private NotificationManager mNM;
    private int NOTIFICATION = 3456;


    public class LocalBinder extends Binder {
        TimersService getService() {
            return TimersService.this;
        }
    }

    @Override
    public void onCreate() {
        mNM = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
        showNotification();
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.i("LocalService", "Received start id " + startId + ": " + intent);
            return START_NOT_STICKY;
    }

    @Override
    public void onDestroy() {
        mNM.cancel(NOTIFICATION);
        Toast.makeText(this, "Alarm", Toast.LENGTH_SHORT).show();
    }

    @Override
    public IBinder onBind(Intent intent) {
        return mBinder;
    }

        private final IBinder mBinder = new LocalBinder();

    private void showNotification() {

        final NotificationCompat.Builder builder = new NotificationCompat.Builder(getBaseContext());
        builder.setSmallIcon(R.drawable.clock_alarm);
        builder.setContentTitle("Time is up");
        builder.setContentText("SLIMS");
        builder.setVibrate(new long[] { 0, 200, 100, 200 });
        final Notification notification = builder.build(); 

        mNM.notify(NOTIFICATION, notification);
        NOTIFICATION += 1;
    }

}

コードを実行すると、メソッド createAlarm が呼び出されます。しかし、私のサービスは作成されません。このコードは、Alexander の Fragotsis のものに基づいて作成しまし。そして、私のServiceクラスはService クラスの Android リファレンスから着想を得ています。

なぜ私Serviceが呼び出されていないのですか?Manifestアラーム、サービス、または通知についてマイに書くべきことはありますか?

ご協力ありがとうございました

Ho と私は、私のコードに関する提案をいただければ幸いです。一定時間後にユーザーに通知する簡単な方法を知っている場合は、お知らせください。

4

1 に答える 1

3

あなたがしているのはユーザーに一度通知することだけなので、サービスはこれに対する最善のアプローチではありません。サービスは、バックグラウンドで動作することを目的としています。通知は、実際にはサービスに適した種類の作業ではありません。短すぎます。したがって、代わりにBroadcastReceiverを使用することをお勧めします。

クラスは次のようになります。

public class TimerReceiver extends BroadcastReceiver {
  private static final int NOTIFICATION = 3456; 

/*since you're always doing a 1-time notification, we can make this final and static, the number
 won't change. If you want it to change, consider using SharedPreferences or similar to keep track 
 of the number. You would have the same issue with a Service since you call stopself() and so,
 you would delete the object every time.*/

  @Override
  public void onReceive(Context context,Intent intent) {

    final NotificationCompat.Builder builder = new NotificationCompat.Builder(context);
    builder.setSmallIcon(R.drawable.clock_alarm);
    builder.setContentTitle("Time is up");
    builder.setContentText("SLIMS");
    builder.setVibrate(new long[] { 0, 200, 100, 200 });
    final Notification notification = builder.build(); 

    mNM.notify(NOTIFICATION, notification);
  }

受信者を呼び出すには、新しいクラスを指すようにインテントを変更する必要があり、であるgetService()必要がありますgetBroadcast()。したがって、これ

Intent myIntent = new Intent(getActivity().getApplication(),
                TimersService.class);


PendingIntent pendingIntent = PendingIntent.getService(getActivity()
                .getApplication(), 0, myIntent, PendingIntent.FLAG_CANCEL_CURRENT);

する必要があります

Intent myIntent = new Intent(getActivity().getApplication(),
                TimerReceiver.class);

PendingIntent pendingIntent = PendingIntent.getBroadcast(getActivity()
                .getApplication(), 0, myIntent, PendingIntent.FLAG_CANCEL_CURRENT);

getActivity().getApplication()また、あなたは安全にただに変わることができるはずですgetActivity()

最後に、マニフェスト宣言が必要です。

<receiver android:name=".TimerReceiver" ></receiver>
于 2013-01-21T20:51:57.803 に答える