当前位置: 首页 > 知识库问答 >
问题:

无法在broadcastreceiver的服务集中获取意图数据

后焕
2023-03-14

我是android开发的新手。我正在开发一个简单的应用程序,其中包含1个活动,1个广播接收器和1个通知服务。有些警报设置在活动中,我想在设备启动/重启时重新设置它们。

下面是我在MainActivity中的代码:

            //randomDates is an (Long) array of time in milliseconds 
            int len = randomDates.length;

            AlarmManager[] alarmManager = new AlarmManager[len];
            ArrayList<PendingIntent> intentArray = new ArrayList();
            String type = "A";
            Long t =  new Date().getTime();
            for (int i = 0; i < len; i++) {
                if(t <= randomDates[i]) {
                    Intent myIntent = new Intent(MainActivity.this, Receiver.class);
                    if (i%2 == 1) {
                        type = "A";
                    } else {
                        type = "P";
                    }
                    myIntent.putExtra("type", type);
                    myIntent.putExtra("time", randomDates[i]);
                    PendingIntent pendingIntent = PendingIntent.getBroadcast(MainActivity.this, i, myIntent, PendingIntent.FLAG_ONE_SHOT);
                    alarmManager[i] = (AlarmManager) getSystemService(ALARM_SERVICE);
                    alarmManager[i].set(AlarmManager.RTC, randomDates[i], pendingIntent);
                    intentArray.add(pendingIntent);
                }
            }

            sharedPref = getSharedPreferences("MyCalApp",Context.MODE_PRIVATE);
            SharedPreferences.Editor editor = sharedPref.edit();
            editor.putBoolean("areAlarmsAlreadySet", false);
            editor.putString("alarmDates",Arrays.toString(randomDates));
            editor.commit();
public void onReceive(Context context, Intent intent) {
        if(intent.getAction() != null && intent.getAction().equalsIgnoreCase("android.intent.action.BOOT_COMPLETED")) {
                Long[] randomDates1 = //get from shared Pref;

                int len = randomDates1.length;
                AlarmManager[] alarmManager = new AlarmManager[len];
                ArrayList<PendingIntent> intentArray = new ArrayList();
                String type = "A";
                Long t = new Date().getTime();
                for (int i = 0; i < len; i++) {
                    if (t <= randomDates1[i]) {
                        Intent myIntent = new Intent(context.getApplicationContext(), NotificationService.class);
                        if (i % 2 == 1) {
                            type = "A";
                        } else {
                            type = "P";
                        }
                        myIntent.putExtra("type", type);
                        myIntent.putExtra("time", randomDates1[i]);
                        PendingIntent pendingIntent = PendingIntent.getBroadcast(context, i, myIntent, PendingIntent.FLAG_ONE_SHOT);
                        alarmManager[i] = (AlarmManager) context.getSystemService(context.ALARM_SERVICE);
                        alarmManager[i].set(AlarmManager.RTC, randomDates1[i], pendingIntent);
                        intentArray.add(pendingIntent);
                    }
                }
            }
        }
        intent.setClass (context, NotificationService.class);
        context.startService(intent);
    }
    Bundle b = intent.getExtras();
    String type = b.getString("type");    // This is line number 38.
    Long time = intent.getLongExtra("time",1l);

我从活动中设置的警报中正确地获取所有通知。但获取NullpointerException

Caused by: java.lang.NullPointerException at com.example.android.basicnotifications.NotificationService.onStart(NotificationService.java:38)

这是我从意图中读到额外内容的地方。我错过了什么?任何帮助都很感激。

附言。所有必要的权限都在清单文件中设置。

共有1个答案

堵雅健
2023-03-14

onreceive()的末尾,执行以下操作:

    intent.setClass (context, NotificationService.class);
    context.startService(intent);

这将使用不包含“额外内容”的意图启动服务。导致NullPointerException的。

此外,在onreceive()中有以下代码:

Intent myIntent = new Intent(context.getApplicationContext(), NotificationService.class);
...
myIntent.putExtra("type", type);
myIntent.putExtra("time", randomDates1[i]);
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, i, myIntent, PendingIntent.FLAG_ONE_SHOT);

你需要更多地注意你正在做的事情。

 类似资料:
  • 我知道,要放入值,我可以,要检索值,我可以,但在下面的代码中,它的行为不像预期的那样。检索值时,我获得。 设置值的代码: 并且我正在检索BroadCaseReceiver的onReceive中的值:[省略的无关代码]

  • 在拦截器中自动连接loggingService时,我正在获取。该bean在拦截器中不可用。但正如我所说的,它可以在主应用程序中注入和使用。 也不能在拦截器中使用读取属性。 这是我的拦截器课。 这是我的配置类,我在其中向主应用程序注册拦截器 我的问题几乎类似于这篇文章不能自动连接HandlerInterceptorAdapter中的服务,但它的不同之处在于我引用了另一个模块中的拦截器,而正如他们所建

  • 我正在使用org.springframework.data.jpa.repository.JpaRepository保存方法来保存一个实体。我认为保存方法来自CrudRepository接口。我从服务类调用这个保存方法。 但问题是< code > DataIntegrityViolationException 在catch块中没有被捕获。相反,我在下面的日志中看到。 和 我甚至尝试捕获Constr

  • 我想从接收正常文件路径,如下所示: 这个文件也存在,但我不能得到它。我在这里看到了一些建议获得路径的问题,如下所示: 但此方法返回以下异常: 因此,我在这里收到的: 如何将文件转换为字符串:

  • 我有一个简单的spring cloud项目,它包含4个服务: 配置:8888 登记处(尤里卡):8761 网关(zuul):8080 服务-1:9527 在此输入图像说明 如果将项目部署在localhost中, 我可以在没有Docker的情况下通过zuul成功获取Service-1的api: http://localhost:8080/service-1/test 但当我使用docker进行部署时