哪个更好?要在Activity或Service类中实例化Broadcast接收器,还是创建一个扩展BroadcastReceiver的类?
下面是我在Service类中实例化BroadcastReceiver的示例。
public BroadcastReceiver receiver = new BroadcastReceiver() {
private String filename;
@Override
public void onReceive(Context context, Intent intent){
String action = intent.getAction();
Bundle extras = intent.getExtras();
filename = extras.getString("AudioPath");
Toast.makeText(AudioService.this, "the audio file name sent: " + filename , Toast.LENGTH_LONG).show();
if(action.equals("com.porno.xxx.AudioPlay")){
selectedAudioPath = audiopath;
String state = intent.getExtras().getString("stringdata");
playSong();
Toast.makeText(AudioService.this, "play audio from service string data "+ state, Toast.LENGTH_LONG).show();
}
else if(action.equals("com.porno.xxx.AudioPause")){
pauseSong();
selectedAudioPath = audiopath;
Toast.makeText(AudioService.this, "pause audio from service", Toast.LENGTH_LONG).show();
}
else if(action.equals("com.porno.xxx.AudioSelector")){
Toast.makeText(AudioService.this, "music selector from service", Toast.LENGTH_LONG).show();
Intent i = new Intent();
audiopath = intent.getStringExtra("filename");
Toast.makeText(AudioService.this, "selelcted audio path: " + audiopath, Toast.LENGTH_LONG).show();
}
else if(action.equals("com.porno.xxx.AudioRelease")){
Toast.makeText(AudioService.this, "My Service Stopped and destoryed", Toast.LENGTH_LONG).show();
player.stop();
if (player != null) player.release();
}
}
};
答案 0 :(得分:1)
首先,您计划使用广播接收器做什么。然后分析最佳和可行的解决方案。 如果您想在活动中注册和取消注册广播接收器,那么您的源代码就可以了。
例如,如果要在应用程序未执行时调用广播接收器(这意味着应用程序退出而不强制关闭)。那么你不应该在编码中注册和取消注册广播接收器。 为此,您创建/实现从BroadcastReceiver扩展的单独类。 在清单文件中,您要添加广播接收器。
答案 1 :(得分:1)
在我打字时提交并接受了答案,所以这就是我所在的地方,很高兴您已经找到了答案! :)
基于您(明显)用作媒体播放器,我建议将播放器实现为服务(如果用户导航,可以继续在后台运行)或作为活动(如果此功能不是'对你的应用程序来说是理想的或适合的。)
BroadcastReceiver
的典型实现是作为应用程序的独立组件,在Manifest中声明,即使在应用程序被杀死时也允许它接收广播;它将开始接收广播,然后在处理后停止。
相反,将BroadcastReceiver
创建为内部类可能是有利的,就像你所做的那样。当你只处理自己的动作时,这很好,因为它很容易启动和停止接收器。
在Service
的{{1}}方法中,您可以创建操作过滤器,然后可以根据应用程序的状态轻松启用或禁用它:
onCreate()