【发布时间】: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