【问题标题】:Android BroadcastReceiver makes app crash when app is not working当应用程序不工作时,Android BroadcastReceiver 使应用程序崩溃
【发布时间】:2012-04-05 23:07:40
【问题描述】:

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

广播接收器

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{}

}

}

我怎样才能让它停止?

【问题讨论】:

    标签: android service android-activity broadcastreceiver


    【解决方案1】:

    从您的清单中删除接收器并在您的服务中本地注册它:

    在您的服务的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);
    }
    

    【讨论】:

    • 完美,效果很好!感谢您分享这段代码!如果其他人有类似的问题,试试这段代码吧!
    【解决方案2】:

    您已经在清单中定义了广播接收器,这就是为什么即使您尚未启动您的应用(或运行该服务),您的应用仍可以收听这些广播的原因。要解决此问题,请在您的服务中以编程方式注册您的广播接收器,以便它仅在播放器运行时有效,而不是一直有效。

    或者在您当前的接收器中,在调用开始/停止音乐方法之前,您应该检查服务是否已经在运行。

    【讨论】:

    • 但是当我执行 if (PlayerService.getInstance() !=null) 时我还没有这样做吗?
    【解决方案3】:

    如果您提供崩溃日志,它将帮助更多。 通过查看您的代码,一切都很好,但是当您检查 PlayerService.getInstance() 时不为空 它会始终为您提供实例,只需在您要播放、停止或暂停时应用一个媒体播放器对象而不是空检查。

    希望对你有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多