我有一个Radio应用程序,它使用服务进行媒体播放器和BroadcastReceiver来检查传入和传出的呼叫以停止或重新启动媒体播放器服务,但是当我退出我的应用时,BroadcastReceiver仍在检查呼叫和它崩溃了我的应用程序即使已经消失(已经完成)这里是代码
清单
<service android:name=".PlayerService"
android:label="@string/app_name">
<intent-filter>
</intent-filter>
</service>
<receiver android:name=".IncomingCallInterceptor">
<intent-filter>
<action android:name="android.intent.action.PHONE_STATE"/>
<action android:name="android.intent.action.NEW_OUTGOING_CALL" />
</intent-filter>
</receiver>
BroadcastReceiver
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.telephony.TelephonyManager;
public class IncomingCallInterceptor extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String state = intent.getStringExtra(TelephonyManager.EXTRA_STATE);
if (PlayerService.getInstance() != null) {
if (TelephonyManager.EXTRA_STATE_RINGING.equals(state)) {
PlayerService.getInstance().stopMusic();
}
if (TelephonyManager.EXTRA_STATE_OFFHOOK.equals(state)) {
PlayerService.getInstance().stopMusic();
}
if (TelephonyManager.EXTRA_STATE_IDLE.equals(state)) {
PlayerService.getInstance().startMusic();
}
}else{}
}
}
如何让它停止?
答案 0 :(得分:3)
从清单中删除接收器并在服务中在本地注册:
在服务的onCreate()
方法中使用此代码:
IncomingCallInterceptor interceptor;
public void onCreate() {
super.onCreate();
//your code here
incerceptor = new IncomingCallInterceptor();
IntentFilter f = new IntentFilter();
f.addAction("android.intent.action.PHONE_STATE");
f.addAction("android.intent.action.NEW_OUTGOING_CALL");
registerReceiver(interceptor, f);
}
不要忘记在服务的onDestroy
方法中取消注册接收器:
public void onDestroy() {
unregisterReceiver(interceptor);
}
答案 1 :(得分:0)
您已在清单中定义了广播接收器,这就是为什么即使您尚未启动应用(或运行服务),您的应用仍然可以收听这些广播。要解决此问题,请在服务中以编程方式注册广播接收器,以便它仅在播放器运行时才有效,而不是所有时间。
或者在您当前的接收器中,在调用开始/停止音乐方法之前,您应该检查该服务是否已经运行。
答案 2 :(得分:0)
如果您提供崩溃日志,它将提供更多帮助。 通过查看您的代码,一切都很好,但是当您检查PlayerService.getInstance()不是null时 它将始终为您提供实例,只需应用媒体播放器对象而不是空检查,同时您将进行播放或停止或暂停。
希望它会对你有所帮助。