BroadcastReceiver的onReceive方法不会被调用

时间:2016-03-14 01:38:27

标签: java android broadcastreceiver alarmmanager

我正在使用 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中做错了,尽管我认为我在那里做了一切。我将不胜感激任何帮助。

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

好。正如您所提到的,AlarmReceiver中无法识别AndroidManifest.xml类。所以我在Android Studio中尝试了它,看起来格式应该是这样的:

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

尝试运行代码,但它会在应用崩溃时返回错误。无论如何,我认为现在这是另一个问题。祝好运。 :)