您的位置:首页 > 移动开发 > Android开发

Android模拟系统的Calllog,统计打电话时间和发送短信的个数

2013-12-13 16:42 453 查看
效果如下:



初学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;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: