1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. android:layout_width="match_parent"
  3. android:layout_height="match_parent"
  4. android:orientation="vertical">
  5.  
  6. <TextView
  7. style="@style/TitleStyle"
  8. android:text="黑名单管理" />
  9.  
  10. <FrameLayout
  11. android:layout_width="match_parent"
  12. android:layout_height="match_parent"
  13. android:layout_weight="11">
  14. <LinearLayout
  15. android:id="@+id/ll_pb"
  16. android:layout_width="match_parent"
  17. android:layout_height="match_parent"
  18. android:gravity="center"
  19. android:orientation="vertical"
  20. android:visibility="invisible">
  21. <ProgressBar
  22. android:layout_width="wrap_content"
  23. android:layout_height="wrap_content" /> <!-- 加载的圆圈 -->
  24. <TextView
  25. android:layout_width="wrap_content"
  26. android:layout_height="wrap_content"
  27. android:text="玩命加载中..." />
  28. </LinearLayout>
  29. <include
  30. android:id="@+id/list_view"
  31. layout="@layout/list_view"></include>
  32. </FrameLayout>
  33.  
  34. <LinearLayout
  35. android:layout_width="match_parent"
  36. android:layout_height="wrap_content"
  37. android:orientation="horizontal">
  38. <Button
  39. android:onClick="prePage"
  40. android:layout_width="wrap_content"
  41. android:layout_height="wrap_content"
  42. android:text="上一页"
  43. android:layout_weight="1"/>
  44. <Button
  45. android:onClick="nextPage"
  46. android:layout_width="wrap_content"
  47. android:layout_height="wrap_content"
  48. android:text="下一页"
  49. android:layout_weight="1"/>
  50. <Button
  51. android:onClick="jump"
  52. android:layout_width="wrap_content"
  53. android:layout_height="wrap_content"
  54. android:text="跳转"
  55. android:layout_weight="1"/>
  56. <EditText
  57. android:id="@+id/et_page_number"
  58. android:layout_width="wrap_content"
  59. android:layout_height="wrap_content"
  60. android:layout_weight="1"/>
  61. <TextView
  62. android:id="@+id/tv_page_numbeer"
  63. android:layout_width="wrap_content"
  64. android:layout_height="wrap_content"
  65. android:text="0/10"
  66. android:textSize="18sp"
  67. android:layout_weight="1"/>
  68. </LinearLayout>
  69. </LinearLayout>

service

  1. package com.itheima52.mobilesafe.service;
  2.  
  3. import main.java.com.itheima52.mobilesafe.activity.CallSafeService;
  4. import main.java.com.itheima52.mobilesafe.activity.SettingActivity;
  5. import android.app.Service;
  6. import android.content.BroadcastReceiver;
  7. import android.content.Context;
  8. import android.content.Intent;
  9. import android.content.IntentFilter;
  10. import android.os.IBinder;
  11. import android.telephony.SmsMessage;
  12. import android.view.View;
  13. import android.view.View.OnClickListener;
  14.  
  15. import com.itheima52.mobilesafe.db.dao.BlackNumberDao;
  16.  
  17. /*
  18. //根据黑名单服务是否运行来更新checkbox
  19. boolean serviceRunning = ServiceStatusUtils.isServiceRunning(this,
  20. "com.itheima52.mobilesafe.service.CallSafeService");
  21. if (serviceRunning) {
  22. siv_callsafe.setChecked(true);
  23. } else {
  24. siv_callsafe.setChecked(false);
  25. }
  26. siv_callsafe.setOnClickListener(new OnClickListener() {
  27. @Override
  28. public void onClick(View v) {
  29. if (siv_callsafe.isChecked()) {
  30. siv_callsafe.setChecked(false);
  31. stopService(new Intent(SettingActivity.this,
  32. CallSafeService.class));// 停止黑名单服务
  33. } else {
  34. siv_callsafe.setChecked(true);
  35. startService(new Intent(SettingActivity.this,
  36. CallSafeService.class));// 开启黑名单服务
  37. }
  38. }
  39. });
  40. */
  41. public class CallSafeService extends Service {
  42.  
  43. private BlackNumberDao dao;
  44.  
  45. public CallSafeService() {
  46. }
  47.  
  48. @Override
  49. public IBinder onBind(Intent intent) {
  50. // TODO: Return the communication channel to the service.
  51. throw new UnsupportedOperationException("Not yet implemented");
  52. }
  53.  
  54. @Override
  55. public void onCreate() {
  56. super.onCreate();
  57.  
  58. dao = new BlackNumberDao(this);
  59. //初始化短信的广播
  60. InnerReceiver innerReceiver = new InnerReceiver();
  61. IntentFilter intentFilter = new IntentFilter("android.provider.Telephony.SMS_RECEIVED");
  62. intentFilter.setPriority(Integer.MAX_VALUE);
  63. registerReceiver(innerReceiver, intentFilter);
  64. }
  65.  
  66. private class InnerReceiver extends BroadcastReceiver{
  67.  
  68. @Override
  69. public void onReceive(Context context, Intent intent) {
  70. System.out.println("短信来了");
  71.  
  72. Object[] objects = (Object[]) intent.getExtras().get("pdus");
  73.  
  74. for (Object object : objects) {// 短信最多140字节,
  75. // 超出的话,会分为多条短信发送,所以是一个数组,因为我们的短信指令很短,所以for循环只执行一次
  76. SmsMessage message = SmsMessage.createFromPdu((byte[]) object);
  77. String originatingAddress = message.getOriginatingAddress();// 短信来源号码
  78. String messageBody = message.getMessageBody();// 短信内容
  79. //通过短信的电话号码查询拦截的模式
  80. String mode = dao.findNumber(originatingAddress);
  81. /**
  82. * 黑名单拦截模式
  83. * 1 全部拦截 电话拦截 + 短信拦截
  84. * 2 电话拦截
  85. * 3 短信拦截
  86. */
  87. if(mode.equals("1")){
  88. abortBroadcast();
  89. }else if(mode.equals("3")){
  90. abortBroadcast();
  91. }
  92. //智能拦截模式 发票 你的头发漂亮 分词(与数据库进行校验判断)
  93. if(messageBody.contains("fapiao")){
  94. abortBroadcast();
  95. }
  96. }
  97. }
  98. }
  99.  
  100. @Override
  101. public void onDestroy() {
  102. super.onDestroy();
  103. }
  104. }

Acticity

  1. package main.java.com.itheima52.mobilesafe.activity;
  2.  
  3. import android.app.Activity;
  4. import android.app.AlertDialog;
  5. import android.content.Context;
  6. import android.content.Intent;
  7. import android.os.Bundle;
  8. import android.os.Handler;
  9. import android.os.Message;
  10. import android.text.Editable;
  11. import android.text.TextUtils;
  12. import android.view.Menu;
  13. import android.view.MenuItem;
  14. import android.view.View;
  15. import android.view.ViewGroup;
  16. import android.widget.AbsListView;
  17. import android.widget.Adapter;
  18. import android.widget.BaseAdapter;
  19. import android.widget.Button;
  20. import android.widget.CheckBox;
  21. import android.widget.EditText;
  22. import android.widget.ImageView;
  23. import android.widget.LinearLayout;
  24. import android.widget.ListView;
  25. import android.widget.NumberPicker;
  26. import android.widget.TextView;
  27. import android.widget.Toast;
  28.  
  29. import java.util.List;
  30.  
  31. import main.java.com.itheima52.mobilesafe.adapter.MyBaseAdapter;
  32. import main.java.com.itheima52.mobilesafe.bean.BlackNumberInfo;
  33. import main.java.com.itheima52.mobilesafe.db.dao.BlackNumberDao;
  34. public class CallSafeActivity extends Activity {
  35.  
  36. private ListView list_view;
  37. private List<BlackNumberInfo> blackNumberInfos;
  38. private LinearLayout ll_pb;
  39. private BlackNumberDao dao;
  40. private CallSafeAdapter adapter;
  41. /**
  42. * 开始的位置
  43. */
  44. private int mStartIndex = 0;
  45. /**
  46. * 每页展示20条数据
  47. */
  48. private int maxCount = 20;
  49. /**
  50. * 一共有多少页面
  51. */
  52. private int totalPage;
  53. private int totalNumber;
  54.  
  55. @Override
  56. protected void onCreate(Bundle savedInstanceState) {
  57. super.onCreate(savedInstanceState);
  58. setContentView(R.layout.activity_call_safe2);
  59. initUI();
  60. initData();
  61. }
  62.  
  63. private Handler handler = new Handler() {
  64. @Override
  65. public void handleMessage(Message msg) {
  66. ll_pb.setVisibility(View.INVISIBLE);
  67. if(adapter == null){
  68. adapter = new CallSafeAdapter(blackNumberInfos, CallSafeActivity.this);
  69. list_view.setAdapter(adapter);
  70. }else{
  71. adapter.notifyDataSetChanged();
  72. }
  73. }
  74. };
  75.  
  76. private void initData() {
  77. dao = new BlackNumberDao(CallSafeActivity.this);
  78. //一共有多少条数据
  79. totalNumber = dao.getTotalNumber();
  80. new Thread() {//异步加载数据
  81. @Override
  82. public void run() {
  83. //分批加载数据
  84. if (blackNumberInfos == null) {
  85. blackNumberInfos = dao.findPar2(mStartIndex, maxCount);
  86. } else {
  87. //把后面的数据。追加到blackNumberInfos集合里面。防止黑名单被覆盖
  88. blackNumberInfos.addAll(dao.findPar2(mStartIndex, maxCount));
  89. }
  90. handler.sendEmptyMessage(0);
  91. }
  92. }.start();
  93. }
  94.  
  95. /**
  96. * 添加黑名单
  97. */
  98. public void addBlackNumber(View view) {
  99. AlertDialog.Builder builder = new AlertDialog.Builder(this);
  100. final AlertDialog dialog = builder.create();
  101. View dialog_view = View.inflate(this, R.layout.dialog_add_black_number, null);
  102. final EditText et_number = (EditText) dialog_view.findViewById(R.id.et_number);
  103. Button btn_ok = (Button) dialog_view.findViewById(R.id.btn_ok);
  104. Button btn_cancel = (Button) dialog_view.findViewById(R.id.btn_cancel);
  105. final CheckBox cb_phone = (CheckBox) dialog_view.findViewById(R.id.cb_phone);
  106. final CheckBox cb_sms = (CheckBox) dialog_view.findViewById(R.id.cb_sms);
  107.  
  108. btn_cancel.setOnClickListener(new View.OnClickListener() {
  109. @Override
  110. public void onClick(View v) {
  111. dialog.dismiss();
  112. }
  113. });
  114.  
  115. btn_ok.setOnClickListener(new View.OnClickListener() {
  116. @Override
  117. public void onClick(View v) {
  118. String str_number = et_number.getText().toString().trim();
  119. if(TextUtils.isEmpty(str_number)){
  120. Toast.makeText(CallSafeActivity.this,"请输入黑名单号码",Toast.LENGTH_SHORT).show();
  121. return;
  122. }
  123. String mode = "";
  124. if(cb_phone.isChecked()&& cb_sms.isChecked()){
  125. mode = "1";
  126. }else if(cb_phone.isChecked()){
  127. mode = "2";
  128. }else if(cb_sms.isChecked()){
  129. mode = "3";
  130. }else{
  131. Toast.makeText(CallSafeActivity.this,"请勾选拦截模式",Toast.LENGTH_SHORT).show();
  132. return;
  133. }
  134. BlackNumberInfo blackNumberInfo = new BlackNumberInfo();
  135. blackNumberInfo.setNumber(str_number);
  136. blackNumberInfo.setMode(mode);
  137. blackNumberInfos.add(0,blackNumberInfo);
  138. //把电话号码和拦截模式添加到数据库。
  139. dao.add(str_number,mode);
  140. if(adapter == null){
  141. adapter = new CallSafeAdapter(blackNumberInfos, CallSafeActivity.this);
  142. list_view.setAdapter(adapter);
  143. }else{
  144. adapter.notifyDataSetChanged();
  145. }
  146. dialog.dismiss();
  147. }
  148. });
  149. dialog.setView(dialog_view);
  150. dialog.show();
  151. }
  152.  
  153. private void initUI() {
  154. ll_pb = (LinearLayout) findViewById(R.id.ll_pb);
  155. //展示加载的圆圈
  156. ll_pb.setVisibility(View.VISIBLE);
  157. list_view = (ListView) findViewById(R.id.list_view);
  158. //设置listview的滚动监听
  159. list_view.setOnScrollListener(new AbsListView.OnScrollListener() {
  160. //状态改变时候回调的方法
  161. /**
  162. * @param scrollState 表示滚动的状态
  163. * AbsListView.OnScrollListener.SCROLL_STATE_IDLE 闲置状态
  164. * AbsListView.OnScrollListener.SCROLL_STATE_TOUCH_SCROLL 手指触摸的时候的状态
  165. * AbsListView.OnScrollListener.SCROLL_STATE_FLING 惯性
  166. */
  167. @Override
  168. public void onScrollStateChanged(AbsListView view, int scrollState) {
  169. switch (scrollState) {
  170. case AbsListView.OnScrollListener.SCROLL_STATE_IDLE://闲置状态
  171. //获取到最后一条显示的数据
  172. int lastVisiblePosition = list_view.getLastVisiblePosition();
  173. System.out.println("lastVisiblePosition==========" + lastVisiblePosition);
  174. if(lastVisiblePosition == blackNumberInfos.size() - 1){//每次加载20条数据
  175. // 加载更多的数据。 更改加载数据的开始位置
  176. mStartIndex += maxCount;
  177. if (mStartIndex >= totalNumber) {
  178. Toast.makeText(getApplicationContext(),
  179. "没有更多的数据了。", Toast.LENGTH_SHORT).show();
  180. return;
  181. }
  182. initData();
  183. }
  184. break;
  185. }
  186. }
  187. //listview滚动的时候调用的方法
  188. //时时调用。当我们的手指触摸的屏幕的时候就调用
  189. @Override
  190. public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
  191. }
  192. });
  193. }
  194.  
  195. private class CallSafeAdapter extends MyBaseAdapter<BlackNumberInfo> {
  196. private CallSafeAdapter(List lists, Context mContext) {
  197. super(lists, mContext);
  198. }
  199. @Override
  200. public View getView(int position, View convertView, ViewGroup parent) {
  201. ViewHolder holder;
  202. if (convertView == null) {
  203. convertView = View.inflate(CallSafeActivity.this, R.layout.item_call_safe, null);
  204. /*<TextView
  205. android:id="@id/tv_mode"
  206. android:layout_width="wrap_content"
  207. android:layout_height="wrap_content"
  208. android:layout_marginLeft="10dp"
  209. android:layout_below="@id/tv_number"
  210. android:text="电话拦截"/>
  211. <!-- ids.xml
  212. <?xml version="1.0" encoding="utf-8"?>
  213. <resources>
  214. <item type="id" name="tv_mode" />
  215. </resources> -->*/
  216. holder = new ViewHolder();
  217. holder.tv_number = (TextView) convertView.findViewById(R.id.tv_number);
  218. holder.tv_mode = (TextView) convertView.findViewById(R.id.tv_mode);
  219. holder.iv_delete = (ImageView) convertView.findViewById(R.id.iv_delete);
  220. convertView.setTag(holder);
  221. } else {
  222. holder = (ViewHolder) convertView.getTag();//节约内存中的convertView对象,内存中永远只有一屏幕个数的convertView。
  223. }
  224. holder.tv_number.setText(lists.get(position).getNumber());
  225. String mode = lists.get(position).getMode();
  226. if (mode.equals("1")) {
  227. holder.tv_mode.setText("来电拦截+短信");
  228. } else if (mode.equals("2")) {
  229. holder.tv_mode.setText("电话拦截");
  230. } else if (mode.equals("3")) {
  231. holder.tv_mode.setText("短信拦截");
  232. }
  233. final BlackNumberInfo info = lists.get(position);
  234. holder.iv_delete.setOnClickListener(new View.OnClickListener() {//也只是holder.iv_delete的一个属性。
  235. @Override
  236. public void onClick(View v) {
  237. String number = info.getNumber();
  238. boolean result = dao.delete(number);
  239. if (result) {
  240. Toast.makeText(CallSafeActivity.this, "删除成功", Toast.LENGTH_SHORT).show();
  241. lists.remove(info);
  242. //刷新界面
  243. adapter.notifyDataSetChanged();
  244. } else {
  245. Toast.makeText(CallSafeActivity.this, "删除失败", Toast.LENGTH_SHORT).show();
  246. }
  247. }
  248. });
  249. return convertView;
  250. }
  251. }
  252.  
  253. static class ViewHolder {
  254. TextView tv_number;
  255. TextView tv_mode;
  256. ImageView iv_delete;
  257. }
  258. }

android140 360 黑名单 启动service和分页加载的更多相关文章

  1. java攻城狮之路(Android篇)--widget_webview_metadata_popupwindow_tabhost_分页加载数据_菜单

    一.widget:桌面小控件1 写一个类extends AppWidgetProvider 2 在清单文件件中注册: <receiver android:name=".ExampleA ...

  2. 【Android进阶】Listview分页加载数据的实现

    Listview分页加载数据的实现 public class MainActivity extends Activity { protected static final int SUCCESS_GE ...

  3. android中滑动SQLite数据库分页加载

    今天用到了android中滑动SQlit数据库分页加载技术,写了个测试工程,将代码贴出来和大家交流一下: MainActivity package com.example.testscrollsqli ...

  4. selenium启动Chrome时,加载用户配置文件

    selenium启动Chrome时,加载用户配置文件   Selenium操作浏览器是不加载任何配置的,网上找了半天,关于Firefox加载配置的多点,Chrome资料很少,下面是关于加载Chrome ...

  5. Android基本控件之listView(三)<用ListView实现分页加载>

    我们之前讨论了ListView的基本使用方法和ListView的优化 今天我们再来讨论一个关于ListView的一个新的东西~就是分页加载.那么什么是分页加载呢?简单点说,就是"下拉刷新&q ...

  6. Android ListView分页加载时图片显示问题

    场景:Android ListView需要分页加载,每个item中会有图片,图片又是从网络下载的. 问题:在滑动加载下一页时,上一页的图片明明已经下载完成了,但是无法显示出来. Bug重现: 1,加载 ...

  7. Android中ListView分页加载数据

    public class MainActivity extends Activity { private ListView listView=null; //listview的数据填充器 privat ...

  8. ListView上拉刷新和分页加载完整的Dome

    很多人工作的过程中都会碰到ListView下拉刷新和分页加载,然后大多数公司都已经把框架写好了,大家直接用就可以了,有些人一直对这个事情处于迷茫状态,为了让大家对上拉刷新和分页加载有一个比较全面的认识 ...

  9. Jetpack 架构组件 Paging 分页加载 MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

随机推荐

  1. Bigger is Better

    题意: 有n个火柴棒,已知拼成9个数字花费的数目,求能拼出的能整除m的最大数 分析: dp[i][j]表示,用i个火柴棒,拼出的数余m余数为j时的最大数 int tmp=dp[i][j]*10+k;( ...

  2. HDU 4336-Card Collector(状压,概率dp)

    题意: 有n种卡片,每包面里面,可能有一张卡片或没有,已知每种卡片在面里出现的概率,求获得n种卡片,需要吃面的包数的期望 分析: n很小,用状压,以前做状压时做过这道题,但概率怎么推的不清楚,现在看来 ...

  3. RockMongo安装使用笔记

    下载nginx最新版本下载PHP,5.X版本即可,非线程安全的的,因为nginx用的是fastcgi下载rockmongo最新版本下载php_mongo组件 在rockmongo里的readme里有下 ...

  4. C++调用matlab实例

    这段代码是C++调用matab引擎的过程,代码的目的很简单,在C++中创建一个vector数组,然后将这个vector数组单位化.写这个代码的目的是学些C++与matlab之间的数据交互,以供日后参考 ...

  5. springMVC(注解版笔记)

    springMVC(注解版) 较之于非注解版本,发生一下变化: 1.配置文件需要配置的标签有: <!-- 包的扫描,此包下面的所有包都启用注解 --> <context:compon ...

  6. 3669 [Noi2014]魔法森林(LCT,最小生成树)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3669 [题意] 给定一个无向图,求1-n的路径中最小的max{ai}+max{bi} ...

  7. PLSQL 连接Oracle11g (64位)

    1.用plsql连不上oracle 11g(64位),先去下载一个oracle 11g(32位客户端) http://www.oracle.com/technetwork/database/featu ...

  8. 《Genesis-3D开源游戏引擎完整实例教程-2D射击游戏篇04:碰撞检测》

    4.碰撞检测 碰撞概述: 游戏世界里,游戏对象不能做出如同在真实世界里的物理运动效果.对于大部分游戏来说,都要为其添加物理系统,让其可以模拟真实世界发生的物理运动.但是在这个打飞机游戏Demo中,是用 ...

  9. 《Genesis-3D开源游戏引擎完整实例教程-2D射击游戏篇03:子弹发射》

    3.子弹发射 子弹发射概述: 在打飞机游戏中,子弹是自动发射的.子弹与子弹之间间隔一定的时间,玩家通过上下左右控制游戏角色,来达到躲避敌人及击中敌人的操作. 发射原理: 抽象理解为有两个容器存放子弹, ...

  10. MATLAB / Simulink on BeagleBone Black

    转自:beagleboard@googlegroups.com邮件组 作者:kevind I have MATLAB / Simulink working with BeagleBone Black. ...