关于安卓AlarmManager定时会失效的问题,请大神指教!

sdssb 2017-09-22 11:10:31
网上找的资料,直接拿来用,但是发现用不了。又在网上找了很多代码,对着敲了一遍还是解决不了。AlarmManager.set一直没有调用onReceive方法。请大神帮我看看,哪错了。下面是我的代码。
public void setAlarm(long id){
Log.e("AndroidBWL","setAlarm start...");
String noticeDate=etDate.getText().toString();
String noticeTime=etTime.getText().toString();
Calendar calendar=Calendar.getInstance();
calendar.set(Integer.parseInt(noticeDate.split("_")[0]),
Integer.parseInt(noticeDate.split("_")[1])-1,
Integer.parseInt(noticeDate.split("_")[2]),
Integer.parseInt(noticeTime.split(":")[0]),
Integer.parseInt(noticeTime.split(":")[1]));
Log.e("AndroidBWL",""+(calendar.getTimeInMillis()-System.currentTimeMillis()));
alarmManager=(AlarmManager)getSystemService(Context.ALARM_SERVICE);
Intent intent=new Intent(AddBwlActivity.this,AlarmReceiver.class);
Bundle bundle=new Bundle();
bundle.putLong("id",id);
bundle.putString("title",etTitle.getText().toString());
bundle.putString("content",etContent.getText().toString());
bundle.putString("noticeDate",etDate.getText().toString());
bundle.putString("noticeTime",etTime.getText().toString());
intent.putExtras(bundle);
intent.setAction("ALARM_ACTION"+calendar.getTimeInMillis());
PendingIntent pi=PendingIntent.getBroadcast(AddBwlActivity.this,0,intent,PendingIntent.FLAG_UPDATE_CURRENT);
alarmManager.set(AlarmManager.RTC_WAKEUP,calendar.getTimeInMillis()+5000,pi);
Log.d("AndroidBWL",""+calendar.getTimeInMillis());
Log.e("AndroidBWL","setAlarm end...");
}


接收代码:这里的日志一直没有打印
public void onReceive(Context context,Intent intent){
Log.e("AndroidBWL","AlarmReceiver:onReceive");
mIntent=intent;
Bundle bundle=mIntent.getExtras();
mNotificationManager=(NotificationManager)context.getSystemService(context.NOTIFICATION_SERVICE);
mIntent.setClass(context,AddBwlActivity.class);
mPendingIntent=PendingIntent.getActivity(context,0,mIntent,0);
Notification.Builder builder=new Notification.Builder(context);
builder.setAutoCancel(true);
builder.setContentTitle(bundle.getString("title"));
builder.setContentText(bundle.getString("content"));
builder.setDefaults(Notification.DEFAULT_SOUND|Notification.DEFAULT_VIBRATE);
builder.setContentIntent(mPendingIntent);
Notification notification=builder.getNotification();
notification.flags|=Notification.FLAG_AUTO_CANCEL;
mNotificationManager.notify(1,notification);

}
...全文
317 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
sdssb 2017-10-08
  • 打赏
  • 举报
回复
原来是没有在AndroidManifest添加接收者: <receiver android:name=".AlarmReceiver" /> 总算解决了
魔爱 2017-09-28
  • 打赏
  • 举报
回复
public class MainActivity extends AppCompatActivity { private AlarmManager mAlarmManager = null; private PendingIntent idleIntent = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); init(this); sendMsg(this); } private void init(Context context){ context.registerReceiver(new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { System.out.println("收到广播啦"); Log.d("changzb","收到广播啦!"); } },new IntentFilter("TEST_INTENT_METHOD")); } private void sendMsg(Context context){ Intent intent = new Intent("TEST_INTENT_METHOD"); idleIntent = PendingIntent.getBroadcast(context,0,intent,0); Log.d("changzb","this.getClass().getPackage().getName() = "+(this.getClass().getPackage().getName())); Log.d("changzb","context.getPackageName() = "+context.getPackageName()); mAlarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); mAlarmManager.set(AlarmManager.RTC_WAKEUP,System.currentTimeMillis()+20000,idleIntent); } } 这个是我写的,可以定时,你 参考一下。
shengshengBoom 2017-09-26
  • 打赏
  • 举报
回复
/** * 开启闹钟 */ private void startRemind(){ Calendar mCalendar = Calendar.getInstance(); mCalendar.setTimeZone(TimeZone.getTimeZone("GMT+8")); mCalendar.set(Calendar.HOUR_OF_DAY, 21); mCalendar.set(Calendar.MINUTE, 0); mCalendar.set(Calendar.SECOND, 0); Intent intent = new Intent(this, AlarmReceiver.class); PendingIntent pi = PendingIntent.getBroadcast(this, 0, intent, 0); //获取闹钟实例 AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE); if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT){ //大于4.4 am.setWindow(AlarmManager.RTC, mCalendar.getTimeInMillis(), 10, pi); }else{ // 小于4.4 am.setRepeating(AlarmManager.RTC, mCalendar.getTimeInMillis(), (60 * 60 * 24 * 1000), pi); } } public class AlarmReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Log.i("测试", "闹钟响了"); Intent i = new Intent(context, AlarmReceiver.class); PendingIntent pi = PendingIntent.getBroadcast(context, 0, i, 0); //获取闹钟实例 AlarmManager am = (AlarmManager) context.getSystemService(ALARM_SERVICE); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { //大于4.4 am.setWindow(AlarmManager.RTC, System.currentTimeMillis() + (60 * 60 * 24 * 1000), 10, pi); } } } 要在AndroidManifest添加接收者: <receiver android:name=".AlarmReceiver" /> 因为大于和小于4.4的都有不同,楼主可以这样试试
sdssb 2017-09-24
  • 打赏
  • 举报
回复
引用 1 楼 u010478851 的回复:
定时器的广播你注册在哪儿了。
 private void registerBoradcastReceiver() {  
  
        IntentFilter myIntentFilter = new IntentFilter();  
        myIntentFilter.addAction(ACTION_NAME);  
        myIntentFilter.addAction(ACTION_NAME2);  
  
        // 注册广播  
        registerReceiver(mBroadcastReceiver, myIntentFilter);  
  
    }  
我网上找的代码,我这样写对吗
sdssb 2017-09-24
  • 打赏
  • 举报
回复
引用 1 楼 u010478851 的回复:
定时器的广播你注册在哪儿了。
protected void onResume(){
        super.onResume();
        Cursor cursor=db.query("tb_bwl",new String[]{"id as _id","title","content","noticeDate","noticeTime"},null,null,null,null,null);
        adapter.changeCursor(cursor);
    }
这是我的代码,这样算不算注册了广播 网上看到有一个源码里是下面这样写的,我是不是也该这样写
protected void onResume() {  
        // TODO Auto-generated method stub  
        super.onResume();  
        // 注册广播  
        registerBoradcastReceiver();  
  
    }  
可以详细的说一下吗
sdssb 2017-09-24
  • 打赏
  • 举报
回复
protected void onResume(){
        super.onResume();
        Cursor cursor=db.query("tb_bwl",new String[]{"id as _id","title","content","noticeDate","noticeTime"},null,null,null,null,null);
        adapter.changeCursor(cursor);
    }
这是我的代码,这样算不算注册了广播 网上看到有一个源码里是下面这样写的,我是不是也该这样写
protected void onResume() {  
        // TODO Auto-generated method stub  
        super.onResume();  
        // 注册广播  
        registerBoradcastReceiver();  
  
    } 
可以详细的说一下吗,我新手,不是很懂
魔爱 2017-09-23
  • 打赏
  • 举报
回复
定时器的广播你注册在哪儿了。

80,348

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧