日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

Android系统自带APP分析——短信app

發(fā)布時間:2024/1/3 38 生活家
生活随笔 收集整理的這篇文章主要介紹了 Android系统自带APP分析——短信app 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

Android操作系統(tǒng)本身就是一個巨大的開源軟件倉庫,熟悉它既可以了解到Android系統(tǒng)的設(shè)計框架,也可以獲得高效的應(yīng)用程序編寫方式。本文所分析的源碼來自于Google官方的AOSP源碼4.0.1_r1,手機的Android版本是CM 4.2.2。對于Android系統(tǒng)分析而言,手機的操作系統(tǒng)版本和源碼版本有些不一致的地方不會有太大的影響,但是如果需要將源碼中的修改安裝到手機里面的話,最不容易遇到問題的辦法就是保持手機中系統(tǒng)的版本和源碼的版本完全一致了。

1.程序入口發(fā)現(xiàn)

每一個應(yīng)用程序都應(yīng)當有各自的入口,使用JAVA編寫的Android應(yīng)用程序也不例外。確認應(yīng)用的入口是確認應(yīng)用在系統(tǒng)中對應(yīng)源碼的第一步,也是應(yīng)用程序分析的第一步。我采用的辦法是將需要分析的短信app運行起來,通過Android自帶工具獲取當前占據(jù)主界面的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欄中用粗體顯示了當前占據(jù)屏幕activity和package,如下圖所示。其中com.android.mms是應(yīng)用的包名,com.adnroid.mms.ui.ConversationList是具體的Activity名稱。

2)也可以直接打開Windows欄進行查看。(Window->Show View->Others->Windows),結(jié)果和上圖一致。

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

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

2.程序功能分析

確定了短信app的報名以及主Activity之后,可以通過軟件搜索(這里用的是everything)確定短信app在源碼中的位置是packagesappsMmssrccomandroidmmsui,并且短信app的啟動activity就是繼承自ListActivity的ConversationList。

1)ActionBar的構(gòu)造

在onCreateOptionsMenu函數(shù)中通過導入conversation_list_menu加載menu項目。

    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.conversation_list_menu, menu);
conversation_list_menu.xml中設(shè)置了:發(fā)送、搜索、設(shè)置、刪除所有等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函數(shù)中的setupActionBar(),從功能上看是用來設(shè)置Actionbar的view的,并且可以顯示未讀短信的條數(shù),但是在CM的手機上沒有看到對應(yīng)的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的構(gòu)造

在oncreate()中設(shè)置listview的屬性,其中setOnCreateContextMenuListener設(shè)置了ContextMenu,通過這個選項的設(shè)置,在用戶單擊了listview一欄之后,調(diào)用onContextItemSelected函數(shù)中的MENU_VIEW: {openThread(threadId);break;}。可以跳轉(zhuǎn)至發(fā)送短信界面。

        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函數(shù)中的initListAdapter()如下:

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

總結(jié)

以上是生活随笔為你收集整理的Android系统自带APP分析——短信app的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。