当关闭应用程序时,广播接收器不起作用

时间:2019-10-21 12:26:18

标签: java android broadcastreceiver

当电话的来电出现在屏幕上时。该应用程序在打开时正在运行。但是,当我完全关闭该应用程序时,即使有语音呼叫,电话也不会显示弹出窗口。关闭应用程序后,广播接收器不工作。

我的设备是小米Mi8

这是我的代码:

public class CallBarring extends BroadcastReceiver {

    private CustomDialog dialog;
    private TelephonyManager telephonyManager;
    private PhoneStateListener listener;
    private Context context;
    private Button btnEndCall;
    private TextView incomingNumberName;
    private List<String> data;

    final NumberInfo numberInfo = new NumberInfo();
    Retrofit retrofit = NetworkClient.getRetrofitClient();
    NumberAPI numberAPI = retrofit.create(NumberAPI.class);
    @Override
    public void onReceive(Context context, Intent intent) {

        if (!intent.getAction().equals("android.intent.action.PHONE_STATE"))
            return;

        else {
            this.context = context;
            if(dialog == null){
                dialog = new CustomDialog(context);
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                    dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY);
                }else{
                    dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
                }
                dialog.getWindow().addFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL);
                dialog.getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON |
                        WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD |
                        WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
                dialog.show();
            }
            // Fetch the number of incoming call
            telephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
            listener = new PhoneStateListener() {
                @Override
                public void onCallStateChanged(int state, String incomingNumber) {
                    String stateString = "N/A";
                    switch (state) {
                        case TelephonyManager.CALL_STATE_IDLE:
                            stateString = "Idle";
                            dialog.dismiss();
                            break;
                        case TelephonyManager.CALL_STATE_OFFHOOK:
                            stateString = "Off Hook";
                            dialog.dismiss();
                            break;
                        case TelephonyManager.CALL_STATE_RINGING:
                            stateString = "Ringing";
                            dialog.show();
                            break;
                    }
                }
            };

            telephonyManager.listen(listener, PhoneStateListener.LISTEN_CALL_STATE);
            telephonyManager.listen(new PhoneStateListener(){
                @Override
                public void onCallStateChanged(int state, String incomingNumber) {
                    super.onCallStateChanged(state, incomingNumber);
                    System.out.println("incomingNumber : "+incomingNumber);
                    fetchUserInfo(incomingNumber);


                }
            },PhoneStateListener.LISTEN_CALL_STATE);

        }
    }

2 个答案:

答案 0 :(得分:0)

许多android设备具有电源管理器和剂量模式概念。因此当应用程序在后台运行时,后台功能会停止。

您可以使用前台服务来注册BroadcastReceiver来收听PHONE_STATE。

答案 1 :(得分:0)

您似乎正在某个活动中注册您的广播接收器(我假设是)。这意味着您的接收器仅在活动处于活动状态时才能工作。但是,当活动终止时,接收者将取消注册,因此将不会监听任何内容。

您需要改为在清单中注册接收器。这样,即使您的应用程序关闭了,您的接收方也会收到PHONE_STATE个事件,并可以触发您的逻辑。

<receiver
    android:name=".CallBarring"
    android:exported="true">
    <intent-filter>
        <action android:name="android.intent.action.PHONE_STATE" />
    </intent-filter>
</receiver>

docs:manifest declared receivers