2016-09-19 73 views
0

我试图设置一个闹钟,它会在特定日期的特定时间给予通知一次,但它会在给定的时间后连续发出通知。并且在应用程序关闭时通知不起作用。但是我想在后台运行通知过程.Essential权限已被添加到清单中,广播接收器也被使用。代码如下。如何创建非重复警报?

private PendingIntent pendingIntent; 

@Override 
public void onCreate(Bundle savedInstanceState) 
{ 

    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    Calendar calendar = Calendar.getInstance(); 

    calendar.set(Calendar.MONTH, Calendar.SEPTEMBER); 
    //calendar.set(Calendar.YEAR, 2016); 
    calendar.set(Calendar.DAY_OF_MONTH, 15); 

    calendar.set(Calendar.HOUR_OF_DAY, 22); 
    calendar.set(Calendar.MINUTE, 30); 
    calendar.set(Calendar.SECOND, 05); 
    //calendar.set(Calendar.AM_PM,Calendar.PM); 
    final int id = (int) System.currentTimeMillis(); 
    Intent myIntent = new Intent(MainActivity.this, AlarmReceiver.class); 
    PendingIntent pendingIntent= PendingIntent.getBroadcast(MainActivity.this, id, myIntent,PendingIntent.FLAG_UPDATE_CURRENT); 

    AlarmManager alarmManager = (AlarmManager)getSystemService(ALARM_SERVICE); 
    alarmManager.set(AlarmManager.RTC_WAKEUP, 
      calendar.getTimeInMillis(), pendingIntent); 
    // If the alarm has been set, cancel it. 
    /*if (alarmManager!= null) { 
     alarmManager.cancel(pendingIntent); 
    }*/ 



} //end onCreate 

}

回答

0

而是在活动中做这个报警的工作,使用服务所以它会在后台运行,而不需要对GUI的布局的。这将解决您的通知问题。 你可以开始here

0

检查此链接 Alarm Manager Example 并更换该 am.setRepeating(AlarmManager.RTC_WAKEUP,System.currentTimeMillis的(),1000 * 60 * 10,PI);由此 am.set(AlarmManager.RTC_WAKEUP,1000 * 60 * 10,pi);

0
new java.util.Timer().schedule(
     new java.util.TimerTask() { 
      @Override 
      public void run() { 
       //instert youre function here 
      } 
     }, 
     50000//or any time until it happend 
); 

希望这对你的工作......

+0

但它有时会重复。我想永久关闭它 – Murtaza

0

试试这个

一个处理程序,您可以发送和处理信息,并与一个线程的MessageQueue Handler

Handler handler = new Handler(); 

    Runnable runnable = new Runnable() { 
    public void run() { 
     //your code 
    handler.postDelayed(runnable, 1000); 
    } 
}; 
handler.post(runnable); 
0
相关Runnable对象

是的,我测试了你的代码,通知没有重复。

  1. Alarm Manager保存所有报警,直到重新启动设备。一旦重新启动设备(关闭和打开),它将释放所有警报。所以你应该在“boot_completed”之后额外设置闹钟。

    public class DeviceBootReceiver extends BroadcastReceiver { 
    
    private static final String TAG = "DeviceBootReceiver"; 
    private Context mContext; 
    
    @Override 
    public void onReceive(Context context, Intent intent) { 
    mContext = context; 
    if (intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)) { 
    // set the Alarm again here... 
    setReminderAlarm(context); 
        } 
    } 
    
  2. 你应该在Android清单文件注册。

    <receiver android:name="com.tcalender.calendartelugu.activity.DeviceBootReceiver" 
    android:enabled="true"> 
    <intent-filter> 
        <action android:name="android.intent.action.BOOT_COMPLETED"/> 
    </intent-filter> 
    </receiver> 
    

3 alarmManager.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(),的PendingIntent);应该只执行一次。

  1. 即使我们关闭了它应该工作的应用程序。