【问题标题】:onReceive method of BroadcastReceiver does not get called未调用 BroadcastReceiver 的 onReceive 方法
【发布时间】:2016-03-14 01:38:26
【问题描述】:

我正在使用 AlarmManager 通过播放声音来创建警报。为此,我首先创建一个PendingIntent,为此我必须创建一个名为AlarmReceiver 的类,该类扩展BroadcastReceiver。在这个新类中,我重写了 onReceive 方法,在该方法中我还启动了声音。但是,根据我的测试,甚至没有从 MainActivity 调用 onReceive 方法。

经过一番研究,我发现我应该在清单文件中声明接收者。因此,我声明了它,但它无法识别类的名称,AlarmReceiver,它以红色显示。我不完全理解如何在清单文件中正确声明。我知道还有其他类似的 SO 问题,我已经全部检查过了,但我仍然无法解决问题。

MainActivity 的代码是:

package com.example.alarmsound;
public class MainActivity extends AppCompatActivity {

public class AlarmReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        final MediaPlayer mp = MediaPlayer.create(context, R.raw.music);
        Log.d("Music", "It went here.");
        mp.start();

        Button stop = (Button) findViewById(R.id.stopAlarm);
        stop.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mp.stop();
            }
        });
    }
}

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

    Calendar t = Calendar.getInstance();
    t.add(Calendar.SECOND, 5);

    Context context = this;
    AlarmManager alarmMgr;
    alarmMgr = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
    Intent intent = new Intent(this, AlarmReceiver.class);
    PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
    alarmMgr.set(AlarmManager.RTC_WAKEUP, t.getTimeInMillis(), pendingIntent);
}
}

Manifest 中的声明是:

<receiver android:name="com.example.alarmsound.AlarmReceiver">
        <intent-filter>
            <action android:name="com.example.alarmsound.MainActivity" />
        </intent-filter>
</receiver>

我也可能在 MainActivity 中做错了事,即使我认为我正在那里做所有事情。

【问题讨论】:

  • 您在 MainActivity 类中有您的 AlarmReceiver。所以你不能将 com.example.alarmsound.AlarmReceiver 声明为 android:name。您必须声明 MainActivity.AlarmReceiver
  • 我刚试过,但还是不行,@Steve。我认为主要问题是它无法识别上一行中的 AlarmReceiver 类的名称。它以红色显示,无法解决。
  • 那是因为它找不到您指定的类。主要是因为你的 AlarmReceiver 不是一个独立的类
  • 为什么你必须在你的活动中拥有接收器?您可以遵循其他设计模式,例如通过 LocalBroadcasts 将消息从接收器传递到您的 Activity。仅仅因为它有效并不意味着它是正确的使用模式。
  • 我实际上并不知道 LocalBroadcasts。我想我会试试的。只是从我在网上查过的样本来看,他们是这样做的。

标签: java android broadcastreceiver alarmmanager


【解决方案1】:

将接收者声明的第一行更改为: &lt;receiver android:name="com.example.alarmsound.MainActivity$AlarmReceiver"&gt;。这应该让 Android 通过清单检测你的类。

$ 符号用于引用 Android Manifest 中的内部类。

【讨论】:

  • 是的,刚刚试过。它给了我一个 RuntimeException 说它无法实例化接收器。在错误的最后,它还说 AlarmReceiver 类没有零参数构造函数。
  • 是的,代码有效。 Android 现在能够检测到您的接收器。 :)
【解决方案2】:

好的。因此,正如您提到的 AlarmReceiver 类无法在 AndroidManifest.xml 中识别。于是我在Android Studio中试了一下,格式好像应该是这样的:

<receiver android:name=".MainActivity$AlarmReceiver">
            <intent-filter>
                <action android:name="com.example.alarmsound.MainActivity" />
            </intent-filter>
        </receiver>

尝试运行代码,但它返回应用程序崩溃的错误。无论如何,我认为现在这是一个不同的问题。

【讨论】:

  • 包名在定义receiver时并不是必须的,一般情况下“.ClassName”就足够了,因为它指的是应用程序的全局包,更具体地说,如。类名
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多