Android操作系统本身就是一个巨大的开源软件仓库,熟悉它既可以了解到Android系统的设计框架,也可以获得高效的应用程序编写方式。本文所分析的源码来自于Google官方的AOSP源码4.0.1_r1,手机的Android版本是CM 4.2.2。对于Android系统分析而言,手机的操作系统版本和源码版本有些不一致的地方不会有太大的影响,但是如果需要将源码中的修改安装到手机里面的话,最不容易遇到问题的办法就是保持手机中系统的版本和源码的版本完全一致了。

1.程序入口发现

每一个应用程序都应当有各自的入口,使用JAVA编写的Android应用程序也不例外。确认应用的入口是确认应用在系统中对应源码的第一步,也是应用程序分析的第一步。我采用的办法是将需要分析的短信app运行起来,通过Android自带工具获取当前占据主界面的activity名称。

Stackoverflow中的回答http://stackoverflow.com/questions/13193592/adb-android-getting-the-name-of-the-current-activity给出了这个问题的三种解决办法:

1)打Hierarchy View(Window->Open Perspective->Other->Hierarchy View),在Windows栏中用粗体显示了当前占据屏幕activity和package,如下图所示。其中com.android.mms是应用的包名,com.adnroid.mms.ui.ConversationList是具体的Activity名称。

2)也可以直接打开Windows栏进行查看。(Window->Show View->Others->Windows),结果和上图一致。

3) 使用dumpsys命令:adb shell "dumpsys window windows | grep -E 'mCurrentFocus|mFocusedApp'" ,结果如下:

dumpsys使用方法见:http://stackoverflow.com/questions/11201659/whats-android-adb-shell-dumpsys-tool-and-its-benefits

2.程序功能分析

确定了短信app的报名以及主Activity之后,可以通过软件搜索(这里用的是everything)确定短信app在源码中的位置是 packages\apps\Mms\src\com\android\mms\ui,并且短信app的启动activity就是继承自ListActivity的ConversationList。

1)ActionBar的构造

在onCreateOptionsMenu函数中通过导入conversation_list_menu加载menu项目。

    public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.conversation_list_menu, menu);
conversation_list_menu.xml中设置了:发送、搜索、设置、删除所有等5个按钮。
<menu xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:id="@+id/action_compose_new"
android:title="@string/new_message"
android:icon="@drawable/ic_menu_msg_compose_holo_dark"
android:showAsAction="always|withText" /> <item android:id="@+id/search"
android:title="@string/menu_search"
android:icon="@drawable/ic_menu_search_holo_dark"
android:showAsAction="ifRoom|collapseActionView"
android:actionViewClass="android.widget.SearchView" /> <item android:id="@+id/action_settings"
android:title="@string/menu_preferences"
android:icon="@android:drawable/ic_menu_preferences" /> <item android:id="@+id/action_delete_all"
android:title="@string/menu_delete_all"
android:icon="@drawable/ic_menu_trash_holo_dark" /> <item android:id="@+id/action_debug_dump"
android:title="@string/menu_debug_dump" />
</menu>

oncreate函数中的setupActionBar(),从功能上看是用来设置Actionbar的view的,并且可以显示未读短信的条数,但是在CM的手机上没有看到对应的view。

    private void setupActionBar() {
ActionBar actionBar = getActionBar(); ViewGroup v = (ViewGroup)LayoutInflater.from(this)
.inflate(R.layout.conversation_list_actionbar, null);
actionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM,
ActionBar.DISPLAY_SHOW_CUSTOM);
actionBar.setCustomView(v,
new ActionBar.LayoutParams(ActionBar.LayoutParams.WRAP_CONTENT,
ActionBar.LayoutParams.WRAP_CONTENT,
Gravity.CENTER_VERTICAL | Gravity.RIGHT)); mUnreadConvCount = (TextView)v.findViewById(R.id.unread_conv_count);
}

2)listview的构造

在oncreate()中设置listview的属性,其中setOnCreateContextMenuListener设置了ContextMenu,通过这个选项的设置,在用户单击了listview一栏之后,调用onContextItemSelected函数中的MENU_VIEW: {openThread(threadId);break;}。可以跳转至发送短信界面。

        mQueryHandler = new ThreadListQueryHandler(getContentResolver());

        ListView listView = getListView();
listView.setOnCreateContextMenuListener(mConvListOnCreateContextMenuListener);
listView.setOnKeyListener(mThreadListKeyListener);
listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL);
listView.setMultiChoiceModeListener(new ModeCallback()); // Tell the list view which view to display when the list is empty
View emptyView = findViewById(R.id.empty);
listView.setEmptyView(emptyView);         initListAdapter();

  listview的初始化,oncreate函数中的initListAdapter()如下:

    private void initListAdapter() {
mListAdapter = new ConversationListAdapter(this, null);
mListAdapter.setOnContentChangedListener(mContentChangedListener);
setListAdapter(mListAdapter);
getListView().setRecyclerListener(mListAdapter);
}

Android系统自带APP分析——短信app的更多相关文章

  1. Android系统应用Mms之Sms短信发送流程(Mms应用部分)二

    1. 新建一条短信, 在发送短信之前, 首先创建的是一个会话Conversation, 以后所有与该接收人(一个或多个接收人)的消息交互, 都在该会话Conversation中. ComposeMes ...

  2. Android黑科技,读取用户短信+修改系统短信数据库

    安卓系统比起ios系统最大的缺点,相信大家都知道,就是系统安全问题.这篇博客就秀一波“黑科技”. 读取用户短信 Android应用能读取用户手机上的短信,相信已经不是什么新鲜事,比如我们收到的短信验证 ...

  3. (转)Android 系统 root 破解原理分析

    现在Android系统的root破解基本上成为大家的必备技能!网上也有很多中一键破解的软件,使root破解越来越容易.但是你思考过root破解的 原理吗?root破解的本质是什么呢?难道是利用了Lin ...

  4. Android中实现全屏、无标题栏的两种办法(另附Android系统自带样式的解释)

    在进行UI设计时,我们经常需要将屏幕设置成无标题栏或者全屏.要实现起来也非常简单,主要有两种方法:配置xml文件和编写代码设置. 1.在xml文件中进行配置 在项目的清单文件AndroidManife ...

  5. Android 系统 root 破解原理分析 (续)

    上文<Android系统root破解原理分析>介绍了Android系统root破解之后,应用程序获得root权限的原理.有一些网友提出对于root破解过程比较感兴趣,也提出了疑问.本文将会 ...

  6. Android调用系统的打电话和发短信界面(1.将消息内容带过去2.实现群发)

    package com.example.myapi.sms; import android.app.Activity; import android.content.Intent; import an ...

  7. 深度分析:Android中Mms设置页面更改短信中心号码流程

    相关控件初始化方法:showSmscPref private void showSmscPref() {         int count = MSimTelephonyManager.getDef ...

  8. [android] 手机卫士黑名单功能(短信拦截)

    前面我们把需要拦截的手机号都存储和展示出来了,接下来是使用广播接收者拦截短信了,这个广播接收者需要和一个服务绑定,服务开启的时候,接收者存在,服务停掉时,接收者关闭 在service包下定义一个类Ca ...

  9. Android系统中自定义按键的短按、双击、长按事件

    在项目中碰到这样的问题: 由于系统中的按键在底层做了重新定义或者新增了按键,此时需要在APP层对按键事件(keyevent)做分解处理,模拟Android系统做法,把keyevent分解成: 1.单击 ...

随机推荐

  1. sqlite原子提交原理

    英文地址 文章参考 简介 支持事务的数据库系统如sqlite的一个重要特性是原子提交(atomic commit).也就是在一个事务中进行的对数据库的写操作要么全部执行,要么全部不执行.看起来像是对数 ...

  2. 定制Android透明按钮

    自己在学习和做例子的过程中,常常会需要按钮,由于系统自带按钮样式不太好看,所以需要我们自己来定制项目得按钮,我常常采用2中方法: 1.是制作9-patch的图片,这样能够匹配文字内容的长短. 2.是指 ...

  3. HandlerThread

    一.概念     1.Android中Handler的使用,一般都在UI主线程中执行,因此在Handler接收消息后,处理消息时,不能做一些很耗时的操作,否则将出现ANR错误. 2.HandlerTh ...

  4. Android 系统API实现数据库的增删改查和SQLite3工具的使用

    在<Android SQL语句实现数据库的增删改查>中介绍了使用sql语句来实现数据库的增删改查操作,本文介绍Android 系统API实现数据库的增删改查和SQLite3工具的使用. 系 ...

  5. UIscrollView和UIPageControl的循环滚动

    因为昨天在网上找了很久,很多只能实现向右滚动,而且一张图一个imageview ,感觉工作量很可怕啊 ,  下面的例子就是不论你多少图 , 只和我代码里面的几个数值有关,  只需要修改分页和循环i的最 ...

  6. 使用T-SQL进行活动目录查询

    最近在某个项目中,需要针对TFS的用户按照所属的AD组来进行数据分析,但发现TFS中并没有存储用户所属的组信息,故考虑直接从AD中提取这个信息并存放在SQL Server的数据库表里面去. 经过一番G ...

  7. 10、技术经理要阅读的书籍 - IT软件人员书籍系列文章

    技术经理是项目组中的重要角色.他需要负责软件项目中的重要部分,如果项目组没有架构师的话,技术经理还需要担负起架构师的职责.同时,技术经理要对项目中的所有重要的技术问题进行处理. 但是,在项目组内部,软 ...

  8. Linux 僵尸进程查杀

    僵尸进程概念 僵尸进程(Zombie process)通俗来说指那些虽然已经终止的进程,但仍然保留一些信息,等待其父进程为其收尸. 书面形式一点:一个进程结束了,但是他的父进程没有等待(调用wait ...

  9. YARN中自己总结的几个关键点

    以前在Hadoop 1.0中JobTracker主要完成两项功能:资源的管理和作业控制.在集群规模过大的场景下,JobTracker 存在以下不足: 1)JobTracker 单点故障. 2)JobT ...

  10. 编写Java应用程序。首先,定义一个Print类,它有一个方法void output(int x),如果x的值是1,在控制台打印出大写的英文字母表;如果x的值是2,在 控制台打印出小写的英文字母表。其次,再定义一个主类——TestClass,在主类 的main方法中创建Print类的对象,使用这个对象调用方法output ()来打印出大 小写英文字母表。

    package zuoye; public class print1 { String a="abcdefghigklmnopqrstuvwxyz"; String B=" ...