[mobilesafe] 07_响一声号码拦截

Android 4.0

响一声号码拦截

步骤:
1、监听电话状态 TelephonyManager.CALL_STATE_RINGING记住开始时间
2、在电话挂断时,
TelephonyManager.CALL_STATE_IDLE:记住结束时间
3、两者时间差如果在2000之内,判断为响一声号码
4、在提示栏提醒用户Notification,并存到数据库
tickerText(标题栏显示一下)
5、当用户点击的时候,开启一个新的Activity来展示拦截到的响一声号码信息
6、然后将该号码信息存储到数据库中
7、当用户点击该notification时,从数据库中读取数据展示给用户看
核心代码:
/**
 * 7、显示来电响一声的notification提醒
 * @param incomingNumber 来电响一声号码
 */
@SuppressWarnings("deprecation")
private void showNotification(String incomingNumber){
    // 1、获取NotificationManager管理者
    NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
    // a)
    Notification notification = new Notification(R.drawable.notification,"响一声来电:"+incomingNumber, System.currentTimeMillis());
    // new Notification() 参数1:提醒图标 ,参数2:提醒文本,参数3:何时提醒
    notification.flags = Notification.FLAG_NO_CLEAR;// 用户点击时,提醒消失。
    
    // d) 要开启的Activity
    Intent intent = new Intent(this,RingOnceBlockListActivity.class);
    // e)设置标记
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);// 一定要指定,//TODO 为什么手机卫士没有开启时,多次点击Notification,一次就可以退出。
    // c)
    PendingIntent contentIntent = PendingIntent.getActivity(this, 0, intent , PendingIntent.FLAG_UPDATE_CURRENT);
    //PendingIntent.getActivity() 上下文,请求码,点击的时候开启的意图,标记
    // b)
    notification.setLatestEventInfo(this"安全管家拦截提醒:""拦截到响一声号码:"+incomingNumber, contentIntent);
    // notification.setLatestEventInfo() 上下文,提醒标题,提醒描述内容,要执行的Intent:PendingIntent
    
    // 2、开启提醒-
    // FIXME→RingOnceBlockListActivity 把号码给添加到响一声的数据库里面.然后在RingOnceBlockListActivity从数据库中读取数据显示出来
    notificationManager.notify(0, notification);
}
结果:



bug1:点击提醒时,调用出显示响一声号码的信息
a)如果手机卫士先开启了,再多次点击Notifycation,开启多个Activity,这时需要多次后退,才能退出。
b)如果手机卫士没有运行,那么多次点击Notifycation,只需要点击一次就可以全部退出了
分析:
指定了intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
解决:在清单文件中,将Activity配置成SingleTop模式
<activity
    android:name="cn.zengfansheng.mobilesafe.RingOnceBlockListActivity"
    android:launchMode="singleTop" >
</activity>
Activity启动模式:
1)android:launchMode="standard" ,标准模式,遵循先进栈后出栈原则
2)android:launchMode="singleTop",如果启动的Activity在栈顶,那么复用该栈,不开启新的栈。
3)android:launchMode="singleTask",如果之前栈里有该Activity,那么将清空上面的Activity
4)android:launchMode="singleInstance",单独开启一个栈,里面只有这一个Activity
bug2:如果多个响一声号码,来时,notification上没有更新
是否配置了PendindIntent.FLAG_UPDATE_CURRENT参数的值。