当应用程序无法运行时,Android BroadcastReceiver会使应用程序崩溃

时间:2012-04-05 23:07:40

标签: android service android-activity broadcastreceiver

我有一个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{}

}

}

如何让它停止?

3 个答案:

答案 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时 它将始终为您提供实例,只需应用媒体播放器对象而不是空检查,同时您将进行播放或停止或暂停。

希望它会对你有所帮助。