响一声号码拦截
步骤: 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参数的值。 |