jiyiuni091 2024-12-19 22:42 采纳率: 0%
浏览 6

我的AlarmReceiver的onReceive进不去啊是为什么

Myservice.java

public class MyService extends Service

1.在MyService里写了BroadcastReceiver,重写了onReceive

public class AlarmReceiver extends BroadcastReceiver
@Override
public void onReceive(Context context, Intent intent) 

MyService的onCreate()注册BroadcastReceiver

public void onCreate() {
   Log.d(TAG,"onCreate:");
   IntentFilter filter = new IntentFilter();
   filter.addAction("android.intent.action.ACTION_ALARM");
   receiver = new AlarmReceiver();
   // 注册BroadcastReceiver
   if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
       Log.d(TAG,"onCreate:registerReceiver");
       MyService.this.registerReceiver(receiver,filter,Context.RECEIVER_EXPORTED);
   }
}

2.写了一个Binder 用于调用系统接口

public class LocalBuilder extends Binder {
   public long getCurrentTime() {
       return System.currentTimeMillis();
   }
   public void setAlarm(long timeMillis) {
       Log.d(TAG,"setAlarm-timeMillis:"+timeMillis);
       AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
       // 创建Intent,指向AlarmReceiver
       Intent intent = new Intent(MyService.this, AlarmReceiver.class);
       PendingIntent alarmIntent = PendingIntent.getBroadcast(MyService.this, 0, intent, PendingIntent.FLAG_MUTABLE);
       alarmManager.set(AlarmManager.RTC_WAKEUP, timeMillis, alarmIntent);
   }
}

MainActivity.java
1.点击按钮响应bindService

binding.button7.setOnClickListener(new View.OnClickListener(){
   @Override
   public void onClick(View v) {
       try {
           //绑定服务
           Boolean isBound  = getApplicationContext().bindService(new Intent(MainActivity.this,MyService.class),serviceConnection,Context.BIND_AUTO_CREATE);


unbindService也写在了相应位置

2.实现了ServiceConnection

private ServiceConnection serviceConnection =new ServiceConnection() {
   @Override
   public void onServiceConnected(ComponentName name, IBinder service) {
       Log.i(TAG,"Service Connected");
       MyService.LocalBuilder binder = (MyService.LocalBuilder) service;
       isBound2 = true;
       // 现在可以调用服务中的方法了
       //获取当前时间
       long currentTime =binder.getCurrentTime();
       Log.d(TAG,"currentTime:"+currentTime);
       //设置闹钟
       long time =System.currentTimeMillis()+60*1000;
       binder.setAlarm(time);
       Log.d(TAG,"setAlarm-time:"+time);

   }
   @Override
   public void onServiceDisconnected(ComponentName name) {
       Log.i(TAG,"Service DisConnected");
       isBound2 = false;
   }
};

现象,点击按钮,可以打印到bindservice log,一直到打印setAlarm的log,但就是不进去onReceive里面 API34 AS23.1.1
QAQ找不到原因,有人帮忙看看吗

  • 写回答

1条回答 默认 最新

  • 关注

    以下回复参考:皆我百晓生券券喵儿等免费微信小程序作答:

    从你的描述和代码中看,问题可能出在以下几个方面:

    1. BroadcastReceiver注册时机:你在onCreate()方法中注册了BroadcastReceiver,但你的服务可能还没有完全创建完成就开始尝试注册广播接收器,这可能会导致注册失败。你可以尝试在服务的onStartCommand()方法中注册广播接收器,确保服务已经启动并准备好接收广播。

    修改如下:

    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.d(TAG,"onStartCommand:");
        IntentFilter filter = new IntentFilter();
        filter.addAction("android.intent.action.ACTION_ALARM");
        receiver = new AlarmReceiver();
        registerReceiver(receiver, filter);
        return START_STICKY; // 或者其他合适的返回值
    }
    

    并在服务销毁时取消注册广播接收器(在onDestroy()方法中)。

    1. PendingIntent的标志:你在创建PendingIntent时使用了PendingIntent.FLAG_MUTABLE标志。这个标志在API级别26及以上版本才支持,如果你的应用运行在较低版本的Android系统上,这个标志可能会导致问题。你可以尝试移除这个标志,或者根据你的应用目标API级别决定是否使用这个标志。
    2. 检查闹钟时间的设置是否正确:在设置闹钟时,确保你的时间设置是正确的,并且你的设备时间设置也是正确的。有时候设备时间设置不正确也会导致闹钟无法触发。
    3. 检查日志输出:确保你的日志输出是有效的,并且你已经查看了所有相关的日志信息。有时候问题可能出在日志输出上,导致你无法看到关键的错误信息。

    如果以上建议都不能解决你的问题,建议你检查一下其他可能的错误来源,比如你的设备是否支持广播接收,或者是否有其他应用或系统进程阻止了广播的接收等。如果问题依然存在,你可以尝试简化你的代码,一步一步地排查问题所在。

    评论

报告相同问题?

问题事件

  • 修改了问题 12月20日
  • 创建了问题 12月19日