Android模拟系统的Calllog,统计打电话时间和发送短信的个数
2013-12-13 16:42
453 查看
效果如下:
![](http://img.blog.csdn.net/20131213164352062?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbWRjaXJl/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
初学Android,做了这个小软件,界面很丑,凑合看了,功能就是统计一段时间内打电话,接电话,发短信,收短信的信息数,只有一个Activity,TabHost + ListView 很简单,做完了,忘得也差不多了,看能回想起什么不,在这里总结一下。代码位置:http://pan.baidu.com/s/1vNsCS
一. 应当是支持开机启动,这个资料一大堆,不过当时在测试的时候不知道怎么回事在虚拟机上总是开机运行一下就自动退出了,虚拟机内存设置的挺大的,不明白是什么原因,最后在真机上是OK的,也就不管了。真的十分懒
开机启动就是接受系统的BOOT_COMPLETED消息就可以了。
第一步:新建一个类继承自BroadcastReceiver在onReceive里startService或者startActivity就可以了
第二步:在AndroidManifest里添加接受消息的类和权限
二. Tabhost+ListView
每一个Tabhost里面是个ListView,给每个ListView设置不同的Adapter,显示不同的数据,listview是带Checkbox的,以方便长按listview时可以多选删除。不懂设计,代码写的非常乱,法克!
activity_main.xml
ListView中的控件:listview_checkbox.xml
对于Listview就是给它设置Adapter了,每个listview都是大同小异,主要是得到相应的数据。
初学Android,做了这个小软件,界面很丑,凑合看了,功能就是统计一段时间内打电话,接电话,发短信,收短信的信息数,只有一个Activity,TabHost + ListView 很简单,做完了,忘得也差不多了,看能回想起什么不,在这里总结一下。代码位置:http://pan.baidu.com/s/1vNsCS
一. 应当是支持开机启动,这个资料一大堆,不过当时在测试的时候不知道怎么回事在虚拟机上总是开机运行一下就自动退出了,虚拟机内存设置的挺大的,不明白是什么原因,最后在真机上是OK的,也就不管了。真的十分懒
开机启动就是接受系统的BOOT_COMPLETED消息就可以了。
第一步:新建一个类继承自BroadcastReceiver在onReceive里startService或者startActivity就可以了
public void onReceive(Context context, Intent intent) { // TODO Auto-generated method stub if (intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)) { Intent intent_ = new Intent(context, CallingAndSmsStatisticsService.class); context.startService(intent_); } }
第二步:在AndroidManifest里添加接受消息的类和权限
<receiver android:name="com.ericdm.callingandsmsstatistics.MyBroadcastReceiver" > <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED" > </action> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </receiver>
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
二. Tabhost+ListView
每一个Tabhost里面是个ListView,给每个ListView设置不同的Adapter,显示不同的数据,listview是带Checkbox的,以方便长按listview时可以多选删除。不懂设计,代码写的非常乱,法克!
activity_main.xml
<TabHost android:id="@+id/theTabHost" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_alignParentLeft="true" android:layout_below="@id/setDateTime" > <LinearLayout android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <TabWidget android:id="@android:id/tabs" android:layout_width="fill_parent" android:layout_height="wrap_content" /> <FrameLayout android:id="@android:id/tabcontent" android:layout_width="fill_parent" android:layout_height="fill_parent" > <ListView android:id="@+id/listViewAll" android:layout_width="fill_parent" android:layout_height="wrap_content" > </ListView> <ListView android:id="@+id/listViewOutgoingCalls" android:layout_width="fill_parent" android:layout_height="wrap_content" > </ListView> <ListView android:id="@+id/listViewIncommingCalls" android:layout_width="fill_parent" android:layout_height="wrap_content" > </ListView> <ListView android:id="@+id/listViewSendedSMS" android:layout_width="fill_parent" android:layout_height="wrap_content" > </ListView> <ListView android:id="@+id/listViewReceviedSMS" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_weight="1" > </ListView> </FrameLayout> </LinearLayout> </TabHost>
ListView中的控件:listview_checkbox.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="horizontal" android:padding="5dp" android:textColor="#000" > <TextView android:id="@+id/listViewTextContent" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="4" android:gravity="center_vertical" android:textSize="17sp" android:textColor="@android:color/holo_blue_dark"/> <TextView android:id="@+id/listViewTextContent_time" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="2" android:gravity="center_vertical" android:textSize="17sp" android:textColor="@android:color/holo_purple"/> <CheckBox android:id="@+id/item_cb" android:layout_width="wrap_content" android:layout_height="wrap_content" android:clickable="false" android:focusable="false" android:focusableInTouchMode="false" android:gravity="center_vertical" /> </LinearLayout>
对于Listview就是给它设置Adapter了,每个listview都是大同小异,主要是得到相应的数据。
public class ListViewAdapterIncommingCall extends BaseAdapter{ private ArrayList<String> list; private ArrayList<String> callTimeList; private Context context; private LayoutInflater layoutInflater = null; public static HashMap<Integer, Boolean> isSelected; public static Boolean isShowCheckBox = false; @SuppressLint("UseSparseArrays") public ListViewAdapterIncommingCall(ArrayList<String> list, ArrayList<String> callTimeList, Context context){ this.context = context; this.list = list; this.callTimeList = callTimeList; layoutInflater = LayoutInflater.from(context);//使用layoutInflater可以在Activity里动态载入指定的xml文件,使其显示xml中定义的控件。 isSelected = new HashMap<Integer, Boolean>();//记录Checkbox是否被选中。 deselectAllItems(); } public ArrayList<String> getSelectItems(){//得到在Listview中多选选中的电话号码。 ArrayList<String> selectedPhoneNumber = new ArrayList<String>(); for (int i = 0; i < list.size(); i++) { if (getIsSelected().get(i)) { selectedPhoneNumber.add(list.get(i)); } } return selectedPhoneNumber; } public void deselectAllItems() {//多选时全不不选中。 for (int i = 0; i < list.size(); i++) { getIsSelected().put(i, false); } } public void inverseSelectItems(){//多选时反选。 for (int i = 0; i < list.size(); i++) { if (getIsSelected().get(i)) { getIsSelected().put(i, false); }else { getIsSelected().put(i, true); } } } public void selectAllItems() {//多选时全选 for (int i = 0; i < list.size(); i++) { getIsSelected().put(i, true); } } public static HashMap<Integer, Boolean> getIsSelected() { return isSelected; } public static boolean isItemSelected(int position){ return isSelected.get(position); } @Override public int getCount() { // TODO Auto-generated method stub return list.size(); } @Override public Object getItem(int position) { // TODO Auto-generated method stub return list.get(position); } @Override public long getItemId(int position) { // TODO Auto-generated method stub return position; } @SuppressWarnings("unused") @Override public View getView(int position, View convertView, ViewGroup parent) { // TODO Auto-generated method stub ViewHolder viewHolder;//ViewHolder缓存从 getView中得到的xml中定义的控件,这样不用每次从XML中去取,提高效率。 if (convertView == null) { viewHolder = new ViewHolder(); convertView = layoutInflater.inflate(R.layout.listview_checkbox, null); viewHolder.tv = (TextView) convertView.findViewById(R.id.listViewTextContent); viewHolder.tv_time = (TextView) convertView.findViewById(R.id.listViewTextContent_time); viewHolder.cb = (CheckBox) convertView.findViewById(R.id.item_cb); convertView.setTag(viewHolder); } else { viewHolder = (ViewHolder) convertView.getTag(); } if (isShowCheckBox) { viewHolder.cb.setVisibility(View.VISIBLE); } else { viewHolder.cb.setVisibility(View.INVISIBLE); } viewHolder.tv.setText((CharSequence) list.get(position)); viewHolder.tv_time.setText((CharSequence) callTimeList.get(position)); viewHolder.cb.setChecked((Boolean) getIsSelected().get(position)); return convertView; } public static class ViewHolder { public TextView tv; public TextView tv_time; public CheckBox cb; } }
相关文章推荐
- Android Zip压缩解压缩
- [Android] 更改关联的源码路径
- [置顶] Android布局管理器 - 详细解析布局实现
- Android 点击AlertDialog中的EditText显示输入框
- android保存文件到SD卡中
- Android开发中The type SmsManager is deprecated
- 理解Android的精度
- Android中LocationManager的简单使用02
- android采用pull解析器解析和生成XML
- 【Android】中兴ZTE sdcard路径的问题
- 【android开发】手写签名系统的设计与实现之实现画笔设置(四)
- Android AIDL IPC机制详解
- AndroidAnnotations——Adapters and lists 适配器和列表
- 利用fiddler给android模拟器抓包
- Android 4.4(KitKat)中VSync信号的虚拟化
- 我的Android进阶之旅------>Android检测wifi连接状态
- Android中dip、dp、sp、pt和px的区别
- Android软键盘与输入框的设置
- 【Android Developers Training】 33. 接收来自其它应用的简单数据
- Android json解析及简单例子