活动可以在系统的默认接收器之前接收无序广播(来电)意图吗?

Vik*_*ngh 6 android

这是场景:

显示活动(活动).如果来电话,活动应该接收意图(将"来电屏幕"发送到后台/将其从显示器中隐藏)并且其本身对用户可见.我不一定想要抑制来电,因为我已经阅读了很多问题,这是公共API无法实现的.

我想要的只是以某种方式使我的活动隐藏在顶部隐藏的Android默认来电屏幕.

仅当我的活动可见时才需要此行为,这与使PHONE_STATE广播接收器启动我的活动不相等.后一个问题在SO上得到了多次回答.

请帮我.我一直在寻找近一天的方向.

谢谢你的时间.

Vik*_*ngh 5

这就是我解决它的方式:

的Manifest.xml

<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
...
<receiver android:name=".MyPhoneBroadcastReceiver">
<intent-filter android:priority="99999">
    <action android:name="android.intent.action.PHONE_STATE" />
    </intent-filter>
</receiver>

<activity android:name=".LockScreenActivity" android:noHistory="true" android:label="@string/app_name" >
    <intent-filter>
        <action android:name="android.intent.action.ANSWER" />
         <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>    
 </activity>
Run Code Online (Sandbox Code Playgroud)

MyPhoneBroadcastReceiver.java

public void onReceive(final Context context, Intent intent) {
    Bundle extras = intent.getExtras();
    ...
    if (extras != null) {
    String state = extras.getString(TelephonyManager.EXTRA_STATE);

     if (state.equals(TelephonyManager.EXTRA_STATE_RINGING)) {
             new Handler().postDelayed(new Runnable() {
          public void run() {
              Intent intentPhoneCall = new Intent("android.intent.action.ANSWER");
                      intentPhoneCall.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
          context.startActivity(intentPhoneCall);
                  }
             }, 100);
         }
    }
}
Run Code Online (Sandbox Code Playgroud)

LockScreenActivity.java - 一个带有UI的常规活动类,显示屏幕已被锁定.它覆盖了屏幕的100%区域,即没有导航/状态栏.HOME/MENU键也被禁用.这就是我实现的目标:如何在我的活动中检测到用户按下HOME键?

PS:技巧不是主要逻辑,而是延迟100ms.没有它,每次在手机上接听电话时,系统默认来电屏幕都会删除您的自定义(家庭)锁定屏幕!