每分钟创建一次通知

时间:2016-01-08 12:47:17

标签: android android-notifications android-alarms

我想每分钟创建一次通知,我每隔48小时从另一个关于通知的问题中提取代码,但应用程序正在运行并且通知不会被创建。我究竟做错了什么? ShowNotification:

public class ShowNotification extends Service {

    private final static String TAG = "ShowNotification";

    @Override
    public void onCreate() {
        super.onCreate();

        Intent mainIntent = new Intent(this, MainActivity.class);

        NotificationManager notificationManager
                = (NotificationManager) this.getSystemService(Context.NOTIFICATION_SERVICE);

        Notification noti = new NotificationCompat.Builder(this)
                .setAutoCancel(true)
                .setContentIntent(PendingIntent.getActivity(this, 0, mainIntent,
                        PendingIntent.FLAG_UPDATE_CURRENT))
                .setContentTitle("New SMS " + System.currentTimeMillis())
                .setContentText("Hello")
                .setDefaults(Notification.DEFAULT_ALL)
                .setSmallIcon(R.drawable.ic_email_white_24dp)
                .setTicker("ticker message")
                .setWhen(System.currentTimeMillis())
                .build();

        notificationManager.notify(0, noti);

        Log.i(TAG, "Notification created");
    }

    @Override
    public IBinder onBind(Intent intent) {
        // TODO Auto-generated method stub
        return null;
    }
}

MainActivity:

context = MainActivity.this;
        Intent notificationIntent = new Intent(context, ShowNotification.class);
        PendingIntent contentIntent = PendingIntent.getService(context, 0, notificationIntent,
                PendingIntent.FLAG_CANCEL_CURRENT);

        AlarmManager am = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
        am.cancel(contentIntent);
        am.setInexactRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis()
                , 1000*60, contentIntent);

1 个答案:

答案 0 :(得分:1)

夫妻建议:

  1. 使用IntentService实现通知解雇代码。如果您使用的是android studio,则可以使用非常简单的向导进行制作。只需右键单击包> new> Service> Service(意图服务)即可。将通知触发代码放在handle操作方法中。这需要在你的清单中声明。

  2. 定义一个BroadcastReceiver,最好在另一个调用静态方法的文件中,在其onReceive()中启动intent服务。这也可以在新的>其他> BroadcastReciever中的向导中使用。这也需要在你的清单中声明。

  3. 创建一个静态方法来初始化警报(我把它放在IntentService本身中)并从你的主要活动中调用它。

  4. 就像现在一样,您为通知提供了相同的ID(0)。 这只会替换原始通知,而不是创建新通知。

  5. 以下代码可能有所帮助:(我使用向导构建它,因此如果它们不准确,请忽略自动生成的注释)

    IntentService:

    import android.app.AlarmManager;
    import android.app.IntentService;
    import android.app.Notification;
    import android.app.NotificationManager;
    import android.app.PendingIntent;
    import android.content.Intent;
    import android.content.Context;
    import android.support.v7.app.NotificationCompat;
    
    
    import java.util.Calendar;
    
    /**
     * An {@link IntentService} subclass for handling asynchronous task requests in
     * a service on a separate handler thread.
     * <p/>
     * helper methods.
     */
    public class NotificationIntentService extends IntentService {
        // TODO: Rename actions, choose action names that describe tasks that this
        // IntentService can perform, e.g. ACTION_FETCH_NEW_ITEMS
        private static final String ACTION_FIRENOTIF = "com.example.alarmnotif.action.FOO";
    
        public NotificationIntentService() {
            super("NotificationIntentService");
        }
        public static void initAlarm(Context context) {
            Calendar updateTime = Calendar.getInstance();
            Intent downloader = new Intent(context, AlarmReceiver.class);
            PendingIntent recurringSync = PendingIntent.getBroadcast(context,
                    0, downloader, PendingIntent.FLAG_CANCEL_CURRENT);
    
            AlarmManager alarms = (AlarmManager) context.getSystemService(
                    Context.ALARM_SERVICE);
            alarms.setInexactRepeating(AlarmManager.RTC_WAKEUP,
                    updateTime.getTimeInMillis(),
                    60000, recurringSync);
        }
    
        /**
         * Starts this service to perform action FireNotif with the given parameters. If
         * the service is already performing a task this action will be queued.
         *
         * @see IntentService
         */
        public static void startActionFireNotif(Context context) {
            Intent intent = new Intent(context, NotificationIntentService.class);
            intent.setAction(ACTION_FIRENOTIF);
            context.startService(intent);
        }
    
    
        @Override
        protected void onHandleIntent(Intent intent) {
            if (intent != null) {
                final String action = intent.getAction();
                if (ACTION_FIRENOTIF.equals(action)) {
                    handleActionFireNotif();
                }
            }
        }
    
        /**
         * Handle actionFireNotif in the provided background thread with the provided
         * parameters.
         */
        private void handleActionFireNotif() {
            Intent mainIntent = new Intent(this, MainActivity.class);
    
            NotificationManager notificationManager
                    = (NotificationManager) this.getSystemService(Context.NOTIFICATION_SERVICE);
    
            Notification noti = new NotificationCompat.Builder(this)
                    .setAutoCancel(true)
                    .setContentIntent(PendingIntent.getActivity(this, 0, mainIntent,
                            PendingIntent.FLAG_UPDATE_CURRENT))
                    .setContentTitle("New SMS " + System.currentTimeMillis())
                    .setContentText("Hello")
                    .setDefaults(Notification.DEFAULT_ALL)
                    .setSmallIcon(R.drawable.ic_email_white_24dp)
                    .setTicker("ticker message")
                    .setWhen(System.currentTimeMillis())
                    .build();
    
            notificationManager.notify(0, noti);
    
        }
    
    
    }
    

    AlarmReciever:

    import android.content.BroadcastReceiver;
    import android.content.Context;
    import android.content.Intent;
    
    public class AlarmReceiver extends BroadcastReceiver {
        public AlarmReceiver() {
        }
    
        @Override
        public void onReceive(Context context, Intent intent) {
            NotificationIntentService.startActionFireNotif(context);
        }
    }
    

    将以下内容添加到清单中:

        <service
            android:name=".alarmnotif.NotificationIntentService"
            android:exported="false" />
    
        <receiver
            android:name=".alarmnotif.AlarmReceiver"
            android:enabled="true"
            android:exported="false"></receiver>