[mobilesafe] 08_应用程序隐蔽入口-使用电话拨打*#7017#开启手机防盗模块

Android 4.0

应用程序隐蔽入口-使用电话拨打*#7017#开启手机防盗模块

使用这种拨号指令指定具有很强的隐蔽性,通常可用于隐蔽应用的进入。
步骤:1、写一个类继承 BroadcastReceiver 
public class OutCallReceiver extends BroadcastReceiver {}
2、清单文件中配置,配置intent-filter,加上权限1000,比默认的还高,配置action
<receiver android:name="cn.zengfansheng.mobilesafe.receiver.OutCallReceiver" >
    <intent-filter android:priority="1000" >
        <action android:name="android.intent.action.NEW_OUTGOING_CALL" />
    </intent-filter>
</receiver>  
3、增加权限
<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" />   处理外拨电话权限
4、增加处理代码,使用指令*#7017#可以激活LostFindActivity,而不是拨打电话
/**
 * 1、外接电话广播接受者-
 * @author hacket
 */
public class OutCallReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        String outNumber = this.getResultData();
        Intent intent2 = new Intent(context, LostFindActivity.class);

        // 注意: 在activity上下文的外部 开启activity 一定要指定activity的任务栈.
        // 下面这句:重要,如果该Activity栈存在,那么用这个,如果不存在,那么重新创建一个。
        // 广播接受者的context 服务里面的上下文 ,都是外部开启Activity
        intent2.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

        if ("*#7017#".equals(outNumber)) {
            // abortBroadcast();//拦截掉当前的广播.不能用,无效.因为外拨电话是一个特殊的广播  直接指定了广播事件的最终接受者
            setResultData(null);
            context.startActivity(intent2);
        }
    }
}
核心代码:
package cn.zengfansheng.mobilesafe.receiver;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import cn.zengfansheng.mobilesafe.LostFindActivity;
/**
 * 1、外接电话广播接受者-
 * @author hacket
 */
public class OutCallReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        String outNumber = this.getResultData();
        Intent intent2 = new Intent(context, LostFindActivity.class);
        // 注意: 在activity上下文的外部 开启activity 一定要指定activity的任务栈.
        // 下面这句:重要,如果该Activity栈存在,那么用这个,如果不存在,那么重新创建一个。
        // 广播接受者的context 服务里面的上下文 ,都是外部开启Activity
        intent2.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        if ("*#7017#".equals(outNumber)) {
            // abortBroadcast();////拦截掉当前的广播.不能用,无效.因为外拨电话是一个特殊的广播  直接指定了广播事件的最终接受者
            setResultData(null);
            context.startActivity(intent2);
        }
    }
}
问题1:开启了 LostFindActivity,但电话还在拨打状态

问题2:指定 abortBroadcast(); 还是这样 
这是因为 因为外拨电话是一个特殊的广播  直接指定了广播事件的最终接受者。abortBroadcast()无效。

问题3: setResultData(null); 这个可以,将数据设置为null,后面的优先级别低的广播接收者,接收到的是一个null,如电话拨号器接到,看到是null,就不会拨打电话。

问题4:对于外部的上下文开启
LostFindActivity, 必须指定下面这句:
如果该LostFindActivity栈存在,那么用这个,如果不存在,那么重新创建一个。 
如:
广播接受者的context 服务里面的上下文 ,都是属于外部开启Activity  
intent2.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);