当电话的来电出现在屏幕上时。该应用程序在打开时正在运行。但是,当我完全关闭该应用程序时,即使有语音呼叫,电话也不会显示弹出窗口。关闭应用程序后,广播接收器不工作。
我的设备是小米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);
}
}
答案 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>