点击会开启服务。

  1. sivAddress.setOnClickListener(new OnClickListener() {
  2. @Override
  3. public void onClick(View v) {
  4. if (sivAddress.isChecked()) {
  5. sivAddress.setChecked(false);
  6. stopService(new Intent(SettingActivity.this,//只写this则表示OnClickListener,所以要写SettingActivity.this,
  7. AddressService.class));// 停止归属地服务
  8. } else {
  9. sivAddress.setChecked(true);
  10. startService(new Intent(SettingActivity.this,
  11. AddressService.class));// 开启归属地服务,就会调用AddressService的onCreate方法监听电话的状态。
  12. }
  13. }
  14. });

检测服务是否正在运行:

  1. package com.itheima52.mobilesafe.utils;
  2.  
  3. import java.util.List;
  4.  
  5. import android.app.ActivityManager;
  6. import android.app.ActivityManager.RunningServiceInfo;
  7. import android.app.ActivityManager.RunningTaskInfo;
  8. import android.content.Context;
  9.  
  10. /**
  11. * 服务状态工具类
  12. *
  13. * // 根据归属地服务是否运行来更新checkbox
  14. boolean serviceRunning = ServiceStatusUtils.isServiceRunning(this,
  15. "com.itheima52.mobilesafe.service.AddressService");//Service的包名类名
  16. */
  17. public class ServiceStatusUtils {
  18. /**
  19. * 检测服务是否正在运行
  20. */
  21. public static boolean isServiceRunning(Context ctx, String serviceName) {
  22. ActivityManager am = (ActivityManager) ctx.getSystemService(Context.ACTIVITY_SERVICE);
  23. List<RunningServiceInfo> runningServices = am.getRunningServices(100);// 获取系统所有正在运行的服务,最多返回100个
  24.  
  25. for (RunningServiceInfo runningServiceInfo : runningServices) {
  26. String className = runningServiceInfo.service.getClassName();// 获取服务的名称
  27. // System.out.println(className);
  28. if (className.equals(serviceName)) {// 服务存在
  29. return true;
  30. }
  31. }
  32. return false;
  33. }
  34. }

自定义组合控件:

  1. package com.itheima52.mobilesafe.view;
  2.  
  3. import android.content.Context;
  4. import android.util.AttributeSet;
  5. import android.view.View;
  6. import android.view.View.OnClickListener;
  7. import android.widget.RelativeLayout;
  8. import android.widget.TextView;
  9.  
  10. import com.itheima52.mobilesafe.R;
  11.  
  12. /**
  13. * 设置中心的自定义组合控件
  14. *
  15. * <com.itheima52.mobilesafe.view.SettingClickView
  16. android:id="@+id/scv_address_location"
  17. android:layout_width="match_parent"
  18. android:layout_height="wrap_content" />
  19.  
  20. private void initAddressStyle() {
  21. scvAddressStyle = (SettingClickView) findViewById(R.id.scv_address_style);
  22. scvAddressStyle.setTitle("归属地提示框风格");
  23. int style = mPref.getInt("address_style", 0);// 读取保存的style
  24. scvAddressStyle.setDesc(items[style]);
  25. scvAddressStyle.setOnClickListener(new OnClickListener() {
  26. @Override
  27. public void onClick(View v) {
  28. showSingleChooseDailog();
  29. }
  30. });
  31. }
  32. */
  33. public class SettingClickView extends RelativeLayout {
  34.  
  35. private TextView tvTitle;
  36. private TextView tvDesc;
  37.  
  38. public SettingClickView(Context context, AttributeSet attrs, int defStyle) {
  39. super(context, attrs, defStyle);
  40. initView();
  41. }
  42.  
  43. public SettingClickView(Context context, AttributeSet attrs) {
  44. super(context, attrs);
  45. initView();
  46. }
  47.  
  48. public SettingClickView(Context context) {
  49. super(context);
  50. initView();
  51. }
  52.  
  53. /**
  54. * 初始化布局
  55. */
  56. private void initView() {
  57. // 将自定义好的布局文件设置给当前的SettingClickView
  58. View.inflate(getContext(), R.layout.view_setting_click, this);
  59. tvTitle = (TextView) findViewById(R.id.tv_title);
  60. tvDesc = (TextView) findViewById(R.id.tv_desc);
  61. }
  62.  
  63. public void setTitle(String title) {
  64. tvTitle.setText(title);
  65. }
  66.  
  67. public void setDesc(String desc) {
  68. tvDesc.setText(desc);
  69. }
  70. }

来去电归属地显示,自定义弹框:

  1. package com.itheima52.mobilesafe.service;
  2.  
  3. import com.itheima52.mobilesafe.R;
  4. import com.itheima52.mobilesafe.db.dao.AddressDao;
  5.  
  6. import android.app.Service;
  7. import android.content.BroadcastReceiver;
  8. import android.content.Context;
  9. import android.content.Intent;
  10. import android.content.IntentFilter;
  11. import android.content.SharedPreferences;
  12. import android.graphics.Color;
  13. import android.graphics.PixelFormat;
  14. import android.os.IBinder;
  15. import android.telephony.PhoneStateListener;
  16. import android.telephony.TelephonyManager;
  17. import android.view.View;
  18. import android.view.WindowManager;
  19. import android.widget.TextView;
  20. import android.widget.Toast;
  21.  
  22. /**
  23. * 来电提醒的服务
  24. * 清单文件注册:<service android:name=".service.AddressService" >
  25. *
  26. */
  27. public class AddressService extends Service {
  28.  
  29. private TelephonyManager tm;
  30. private MyListener listener;
  31. private OutCallReceiver receiver;
  32. private WindowManager mWM;
  33. private View view;
  34. private SharedPreferences mPref;
  35.  
  36. @Override
  37. public IBinder onBind(Intent intent) {
  38. return null;
  39. }
  40.  
  41. @Override
  42. public void onCreate() {
  43. super.onCreate();
  44.  
  45. mPref = getSharedPreferences("config", MODE_PRIVATE);
  46. //来电是通过TelephonyManager服务来监听,去电是通过广播接受者来接收,这是安卓的api决定的。
  47.  
  48. tm = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
  49. listener = new MyListener();
  50. tm.listen(listener, PhoneStateListener.LISTEN_CALL_STATE);// 监听来电的状态,
  51.  
  52. receiver = new OutCallReceiver();
  53. IntentFilter filter = new IntentFilter(Intent.ACTION_NEW_OUTGOING_CALL);
  54. registerReceiver(receiver, filter);// 动态注册广播
  55. }
  56.  
  57. class MyListener extends PhoneStateListener {
  58. @Override
  59. public void onCallStateChanged(int state, String incomingNumber) {
  60. switch (state) {
  61. case TelephonyManager.CALL_STATE_RINGING:// 电话铃声响了
  62. System.out.println("电话铃响...");
  63. String address = AddressDao.getAddress(incomingNumber);// 根据来电号码查询归属地
  64. // Toast.makeText(AddressService.this, address,
  65. // Toast.LENGTH_LONG)
  66. // .show();
  67. showToast(address);
  68. break;
  69. case TelephonyManager.CALL_STATE_IDLE:// 电话闲置状态,挂断电话的时候消除showToast()方法产生的WindowManager窗口。
  70. if (mWM != null && view != null) {
  71. mWM.removeView(view);// 从window中移除view,否则这个窗口会一直显示在手机屏幕。
  72. view = null;
  73. }
  74. break;
  75. default:
  76. break;
  77. }
  78. super.onCallStateChanged(state, incomingNumber);
  79. }
  80. }
  81.  
  82. /**
  83. * 监听去电的广播接受者 需要权限: android.permission.PROCESS_OUTGOING_CALLS
  84. */
  85. class OutCallReceiver extends BroadcastReceiver {
  86. @Override
  87. public void onReceive(Context context, Intent intent) {
  88. String number = getResultData();// 获取去电电话号码
  89. String address = AddressDao.getAddress(number);
  90. Toast.makeText(context, address, Toast.LENGTH_LONG).show();
  91. showToast(address);
  92. }
  93. }
  94.  
  95. @Override
  96. public void onDestroy() {
  97. super.onDestroy();//停掉本AddressService服务,但是他里面的tm服务监听没有停止,
  98. tm.listen(listener, PhoneStateListener.LISTEN_NONE);// 停止来电监听
  99. unregisterReceiver(receiver);// 注销去电广播
  100. }
  101.  
  102. /**
  103. * 自定义归属地浮窗
  104. */
  105. private void showToast(String text) {
  106. mWM = (WindowManager) this.getSystemService(Context.WINDOW_SERVICE);//系统服务,WindowManager可以一直显示在手机屏幕上。
  107. //模仿的Toast源码
  108. WindowManager.LayoutParams params = new WindowManager.LayoutParams();
  109. params.height = WindowManager.LayoutParams.WRAP_CONTENT;
  110. params.width = WindowManager.LayoutParams.WRAP_CONTENT;
  111. params.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
  112. | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE
  113. | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON;
  114. params.format = PixelFormat.TRANSLUCENT;
  115. params.type = WindowManager.LayoutParams.TYPE_TOAST;
  116. params.setTitle("Toast");
  117.  
  118. // view = new TextView(this);
  119. view = View.inflate(this, R.layout.toast_address, null);
  120. /*<?xml version="1.0" encoding="utf-8"?>
  121. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  122. android:layout_width="wrap_content"
  123. android:layout_height="wrap_content"
  124. android:background="@drawable/call_locate_blue"
  125. android:gravity="center_vertical"
  126. android:orientation="horizontal" >
  127. <ImageView
  128. android:id="@+id/imageView1"
  129. android:layout_width="wrap_content"
  130. android:layout_height="wrap_content"
  131. android:src="@android:drawable/ic_menu_call" /> 安卓的图片
  132. <TextView
  133. android:id="@+id/tv_number"
  134. android:layout_width="wrap_content"
  135. android:layout_height="wrap_content"
  136. android:text="未知号码"
  137. android:textSize="18sp"
  138. android:textColor="#fff" />
  139. </LinearLayout>*/
  140. int[] bgs = new int[] { R.drawable.call_locate_white,
  141. R.drawable.call_locate_orange, R.drawable.call_locate_blue,
  142. R.drawable.call_locate_gray, R.drawable.call_locate_green };
  143. int style = mPref.getInt("address_style", 0);
  144.  
  145. view.setBackgroundResource(bgs[style]);// 根据存储的样式更新背景
  146.  
  147. TextView tvText = (TextView) view.findViewById(R.id.tv_number);
  148. tvText.setText(text);
  149.  
  150. mWM.addView(view, params);// 将view添加在屏幕上(Window,所有的控件都显示在window上,在windoew上面可以显示Activity和fragment,)
  151. }
  152. }

android135 360 来电去电归属地显示,自定义toast,的更多相关文章

  1. 自定义Toast和RatingBar的简单用例

    Toast是一个包含用户点击消息.Toast类会帮助你创建和显示这些.Android中的Toast是一种简易的消息提示框. 当视图显示给用户,在应用程序中显示为浮动 向右划动五角星增加 单击按钮显示自 ...

  2. Android MTK平台 客制化系统来电界面(屏蔽 InCallUI 提供接口给客户自行展示来电去电页面)

    OS: Android 8.1 需求分析 1.禁止系统来电铃声,提供接口给客户自己播放铃声 2.禁止系统拉起来去电页面(InCallActivity),消息通知客户拉起自己的来去电页面 3.禁止来电消 ...

  3. ASP.NET Core中显示自定义错误页面-增强版

    之前的博文 ASP.NET Core中显示自定义错误页面 中的方法是在项目中硬编码实现的,当有多个项目时,就会造成不同项目之间的重复代码,不可取. 在这篇博文中改用middleware实现,并且放在独 ...

  4. ASP.NET Core中显示自定义错误页面

    在 ASP.NET Core 中,默认情况下当发生500或404错误时,只返回http状态码,不返回任何内容,页面一片空白. 如果在 Startup.cs 的 Configure() 中加上 app. ...

  5. 判断数据库内容,在页面显示自定义数据case when

    判断数据库内容,在页面显示自定义数据 case when...then ...else...end 比如:数据库内容是这样: 通过sql语句判断,数据库的name字段,内容是月桂的,显示嫦娥,其他的显 ...

  6. android 自定义Toast显示风格

    1.创建一个自己想要显示Toast风格的XML如下代码(toast_xml.xml): <?xml version="1.0" encoding="utf-8&qu ...

  7. DedeCMS中实现在顶层banner中显示自定义登录信息

    一.需求描述 dedeCMS自带的模板中有互动中心模块,如下图所示: 由于会员登陆对我来说不是网站的重要模块且默认DedeCMS的会员中心模块的初始化很慢,常会显示“正在载入中,请稍候...”, 所以 ...

  8. 双击CAD对象(具有扩展数据),显示自定义对话框实现方法

    转自:Cad人生 链接:http://www.cnblogs.com/cadlife/p/3463337.html 题目:双击CAD对象,显示自定义对话框实现方法 内容粘贴如下: 主要是绑定两个事件: ...

  9. ToastUtil【简单的Toast封装类】【未自定义Toast的显示风格】

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 一个简单的Toast封装类. 效果图 API = 6.0 API = 4.4.2 代码分析 实现了不管我们触发多少次Toast调用, ...

随机推荐

  1. 漫谈MySql中的事务

    最近一直在做订单类的项目,使用了事务.我们的数据库选用的是MySql,存储引擎选用innoDB,innoDB对事务有着良好的支持.这篇文章我们一起来扒一扒事务相关的知识. 为什么要有事务? 事务广泛的 ...

  2. (转)MySQL数据库引擎ISAM MyISAM HEAP InnoDB的区别

    转自:http://blog.csdn.net/nightelve/article/details/16895917 MySQL数据库引擎取决于MySQL在安装的时候是如何被编译的.要添加一个新的引擎 ...

  3. [Bhatia.Matrix Analysis.Solutions to Exercises and Problems]ExI.4.4

    (1). There is a natural isomorphism between the spaces $\scrH\otimes \scrH^*$ and $\scrL(\scrH,\scrK ...

  4. create a C# context menu from code

    I try the one of your approach, it works well in my computer. Below is my code: public void AddConte ...

  5. Codeforces 629C Famil Door and Brackets DP

    题意:给你一个由括号组成的字符串,长度为m,现在希望获得一个长度为n(全由括号组成)的字符串,0<=n-m<=2000 这个长度为n的字符串要求有两个性质:1:就是任意前缀,左括号数量大于 ...

  6. PICT实现组合测试用例(二)

    上次简单总结了PICT命令的一些用法,这次重新把<软件测试实战>里面有关这一章的内容再总结一次,以巩固理解. 组合测试的概念 组合测试(combinatorial testing)是一种测 ...

  7. js实现收缩菜单效果

    废话不多说,直接上代码: 有注释 <head> <title></title> <style type="text/css"> di ...

  8. C++设计模式——策略模式

    策略模式 在GOF的<设计模式:可复用面向对象软件的基础>一书中对策略模式是这样说的:定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换.该模式使得算法可独立于使用它的客户而变化 ...

  9. sqlite 修改表名,合并数据库(文件)

    修改表名:ALTER TABLE orig_table_name RENAME TO tmp_table_name; 将某个数据库的一个表的数据插入到另一个数据库的某个表里:1.先连接数据库A2.再a ...

  10. Java网络编程(UDP协议:发送端)

    package WebProgramingDemo; import java.io.IOException; import java.net.DatagramPacket; import java.n ...