2013-10-11 165 views
4

我想每5分钟向用户发送一次通知,我正在使用以下代码。 它显示我通知第一次,但不给下一次。每隔5分钟通知

public void startAlarm() { 
    AlarmManager alarmManager = (AlarmManager) this.getSystemService(this.ALARM_SERVICE); 
    long whenFirst = System.currentTimeMillis();   // notification time 
    Intent intent = new Intent(this, NotifyUser.class); 
    PendingIntent pendingIntent = PendingIntent.getService(this, 0, intent, 0); 
    alarmManager.setRepeating(AlarmManager.RTC, whenFirst, 60*5000, pendingIntent);    
} 

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

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

    private void loadNotification() { 
     NotificationManager nm = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); 
     Notification notify = new Notification(R.drawable.ic_launcher/*android.R.drawable.stat_notify_more*/, "Hanumanji waiting for you", System.currentTimeMillis()); 
     Context context = NotifyUser.this; 
     CharSequence title = "Hanumanji is waiting for you"; 
     CharSequence details = "Do Hanuman Chalisa Parayan with ShlokApp."; 
     Intent intent = new Intent(context, NotifyUser.class); 
     PendingIntent pending = PendingIntent.getActivity(context, 0, intent, 0); 
     notify.setLatestEventInfo(context, title, details, pending); 
     notify.sound = Uri.parse("android.resource://pro.shlokapp.hanumanchalisa/"+ R.raw.game_sound_pause); 
     nm.notify(0, notify); 
    } 

    public int onStartCommand(Intent intent, int flags, int startId) { 
     return 1; 
    } 

    public void onStart(Intent intent, int startId) { 
     // TO DO 
    } 

    public IBinder onUnBind(Intent arg0) { 
     // TO DO Auto-generated method 
     return null; 
    } 

    public void onStop() {} 

    public void onPause() {} 

    @Override 
    public void onDestroy() {} 

    @Override 
    public void onLowMemory() {} 
} 
+0

你确定1 /你不取消的通知,并在活动上课? 2 /你是不是简单地更新现有的通知? – njzk2

+0

如何更新现有通知? – user2546410

+0

当你调用'nm.notify(0,notify);'你总是传递相同的通知ID(即'0'),从而更新现有的通知,而不是创建一个新的通知。为不同的通知传递不同的数字。 – Piovezan

回答

1
在这个岗位

How exactly to use Notification.Builder有一个例子。我用它在我的应用程序中进行通知。它也使用支持库中的NotificationBuilder。

我想在你上面的代码中,你只是更新通知,那已经在那里了。尝试通过显示每次设置/更新新通知时增加1的数字来检查它。

希望这会帮助你=)。

4

它显示我通知第一次,但不给下一次。:原因是你使用nm.notify(0, notify); 不要使用0,因为它会显示最新的通知。

下面的代码工作就像一个魅力:

public class MainActivity extends Activity { 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    MyTimerTask myTask = new MyTimerTask(); 
    Timer myTimer = new Timer(); 

    myTimer.schedule(myTask, 5000, 1500); 

} 

class MyTimerTask extends TimerTask { 
    public void run() { 

     generateNotification(getApplicationContext(), "Hello"); 
    } 
} 

private void generateNotification(Context context, String message) { 

    int icon = R.drawable.ic_launcher; 
    long when = System.currentTimeMillis(); 
    String appname = context.getResources().getString(R.string.app_name); 
    NotificationManager notificationManager = (NotificationManager) context 
      .getSystemService(Context.NOTIFICATION_SERVICE); 
    int currentapiVersion = android.os.Build.VERSION.SDK_INT; 
    Notification notification; 
    PendingIntent contentIntent = PendingIntent.getActivity(context, 0, 
      new Intent(context, MainActivity.class), 0); 

    // To support 2.3 os, we use "Notification" class and 3.0+ os will use 
    // "NotificationCompat.Builder" class. 
    if (currentapiVersion < android.os.Build.VERSION_CODES.HONEYCOMB) { 
     notification = new Notification(icon, message, 0); 
     notification.setLatestEventInfo(context, appname, message, 
       contentIntent); 
     notification.flags = Notification.FLAG_AUTO_CANCEL; 
     notificationManager.notify((int) when, notification); 

    } else { 
     NotificationCompat.Builder builder = new NotificationCompat.Builder(
       context); 
     notification = builder.setContentIntent(contentIntent) 
       .setSmallIcon(icon).setTicker(appname).setWhen(0) 
       .setAutoCancel(true).setContentTitle(appname) 
       .setContentText(message).build(); 

     notificationManager.notify((int) when, notification); 

    } 

} 

}

使用Timer类。根据需要更改计时器间隔。 希望这有助于。

0

MainActivity.java //它包含一个TextView tvTime

public class MainActivity extends Activity { 
    private SampleAlarmReceiver alarm; 
    private ListView listView; 
    private ArrayList<String> times; 
    private ArrayAdapter mAdapter; 

    private BroadcastReceiver mMessageReceiver = new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context context, Intent intent) { 
      displayTime(); 
     } 
    }; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     listView = (ListView) findViewById(R.id.listView); 
     alarm = new SampleAlarmReceiver(); 
     alarm.setAlarm(this); 
     times = new ArrayList<>(); 
     Calendar c = Calendar.getInstance(); 
     String time = c.get(Calendar.HOUR) + ":" + c.get(Calendar.MINUTE) + ":" + c.get(Calendar.SECOND); 
     times.add(time); 
     mAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, times); 
     listView.setAdapter(mAdapter); 
    } 

    @Override 
    protected void onResume() { 
     super.onResume(); 
     LocalBroadcastManager.getInstance(this).registerReceiver(mMessageReceiver, 
       new IntentFilter("display_time")); 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     getMenuInflater().inflate(R.menu.main, menu); 
     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     switch (item.getItemId()) { 
      // When the user clicks START ALARM, set the alarm. 
      case R.id.start_action: 
       alarm.setAlarm(this); 
       return true; 
      // When the user clicks CANCEL ALARM, cancel the alarm. 
      case R.id.cancel_action: 
       alarm.cancelAlarm(this); 
       return true; 
     } 
     return false; 
    } 

    @Override 
    protected void onDestroy() { 
     super.onDestroy(); 
     LocalBroadcastManager.getInstance(this).unregisterReceiver(mMessageReceiver); 
    } 

    @SuppressLint("SetTextI18n") 
    public void displayTime() { 
     Calendar c = Calendar.getInstance(); 
     String time = c.get(Calendar.HOUR) + ":" + c.get(Calendar.MINUTE) + ":" + c.get(Calendar.SECOND); 
     times.add(time); 
     mAdapter.notifyDataSetChanged(); 
    } 
} 

SampleAlarmReceiver.java

public class SampleAlarmReceiver extends WakefulBroadcastReceiver { 
    // The app's AlarmManager, which provides access to the system alarm services. 
    private AlarmManager alarmMgr; 
    // The pending intent that is triggered when the alarm fires. 
    private PendingIntent alarmIntent; 

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

     Intent intent1 = new Intent("display_time"); 
     // You can also include some extra data. 
     LocalBroadcastManager.getInstance(context).sendBroadcast(intent1); 

    } 

    // BEGIN_INCLUDE(set_alarm) 

    /** 
    * Sets a repeating alarm that runs once a day at approximately 8:30 a.m. When the 
    * alarm fires, the app broadcasts an Intent to this WakefulBroadcastReceiver. 
    * 
    * @param context given context 
    */ 
    public void setAlarm(Context context) { 
     alarmMgr = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); 
     Intent intent = new Intent(context, SampleAlarmReceiver.class); 
     alarmIntent = PendingIntent.getBroadcast(context, 0, intent, 0); 

     alarmMgr.setInexactRepeating(AlarmManager.RTC_WAKEUP, 
       5 * 60 * 1000, // After five minute 
       5 * 60 * 1000, // Every five minute 
       alarmIntent); 

     // Enable {@code SampleBootReceiver} to automatically restart the alarm when the 
     // device is rebooted. 
     ComponentName receiver = new ComponentName(context, SampleBootReceiver.class); 
     PackageManager pm = context.getPackageManager(); 

     pm.setComponentEnabledSetting(receiver, 
       PackageManager.COMPONENT_ENABLED_STATE_ENABLED, 
       PackageManager.DONT_KILL_APP); 
    } 

    /** 
    * Cancels the alarm. 
    * 
    * @param context given context 
    */ 
    public void cancelAlarm(Context context) { 
     // If the alarm has been set, cancel it. 
     if (alarmMgr != null) { 
      alarmMgr.cancel(alarmIntent); 
     } 

     // Disable {@code SampleBootReceiver} so that it doesn't automatically restart the 
     // alarm when the device is rebooted. 
     ComponentName receiver = new ComponentName(context, SampleBootReceiver.class); 
     PackageManager pm = context.getPackageManager(); 

     pm.setComponentEnabledSetting(receiver, 
       PackageManager.COMPONENT_ENABLED_STATE_DISABLED, 
       PackageManager.DONT_KILL_APP); 
    } 
} 

SampleBootReceiver.java

public class SampleBootReceiver extends BroadcastReceiver { 
    SampleAlarmReceiver alarm; 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     if (intent.getAction().equals("android.intent.action.BOOT_COMPLETED")) 
     { 
      alarm = new SampleAlarmReceiver(); 
      alarm.setAlarm(context); 
     } 
    } 
} 

main.xml中 //它在MainActivity使用的菜单

<menu xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto"> 
    <item 
     android:id="@+id/start_action" 
     android:title="Start Alarm" 
     app:showAsAction="ifRoom|withText" /> 
    <item 
     android:id="@+id/cancel_action" 
     android:title="Stop Alarm" 
     app:showAsAction="ifRoom|withText" /> 
</menu> 

的manifest.xml

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.example.alarmmanager"> 

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

    <application 
     android:allowBackup="true" 
     android:icon="@mipmap/ic_launcher" 
     android:label="@string/app_name" 
     android:supportsRtl="true" 
     android:theme="@style/AppTheme"> 
     <activity android:name=".MainActivity"> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 

     <receiver android:name=".SampleAlarmReceiver" /> 

     <receiver 
      android:name=".SampleBootReceiver" 
      android:enabled="false"> 
      <intent-filter> 
       <action android:name="android.intent.action.BOOT_COMPLETED" /> 
      </intent-filter> 

     </receiver> 

    </application> 

</manifest>