五年了,該走了。感謝qisda.
分析下settings的啟動過程。版本是4.0的。在Launcher的public boolean onCreateOptionsMenu(Menu menu) 設置了如何啟動settings. 就是發送個Intent.
Intent settings = new Intent(android.provider.Settings.ACTION_SETTINGS);
settings.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
| Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
進入了app/Settings onCreate--->super.onCreate(PreferenceAcrtivity)-->setContentView(com.android.internal.R.layout.preference_list_content);
這句是布置了畫面。然后會回調public void onContentChanged()獲取了listView的對象。然后繼續往下進入了--》
onBuildHeaders(mHeaders);這個東西是關鍵,這個實際叫到了Settings->onBuildHeaders 這個函數會解釋xml 也就是畫面文件了。loadHeadersFromResource(R.xml.settings_headers, headers);這個東西就是在解釋xml文件,蘇州qisda, 臧春傑 如何解釋xml呢?呵呵。這個有固定格式的 這里也是用到了Adatper, private static class HeaderAdapter extends ArrayAdapter<Header>, 既然是adapter, 哪肯定都是前台顯示和數據源關聯起來,前台就是listview.哪真正的數據就是解釋的xml存放到了arrayList里了。也就是mHeaders,
target.add(header); 繼續從PreferenceActivity onCreate往下走,到了else if (mHeaders.size() > 0) {
setListAdapter(new HeaderAdapter(this, mHeaders));
這就是把剛才的數據源綁定到了Adapter, 已被listview借口轉換。這樣就可以通過getView返回了,當時這里都是使用了tag 加判斷重用。一貫的做飯,nancy很清楚的。
同時listView 注冊了listener mList.setOnItemClickListener(mOnClickListener);
private AdapterView.OnItemClickListener mOnClickListener = new AdapterView.OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View v, int position, long id)
{
onListItemClick((ListView)parent, v, position, id);
}
};
當用戶touch的時候,在settings里告訴系統做什么。
protected void onListItemClick(ListView l, View v, int position, long id) {
super.onListItemClick(l, v, position, id); //蘇州 佳世達 臧春傑
if (mAdapter != null) {
Object item = mAdapter.getItem(position);
if (item instanceof Header) onHeaderClick((Header) item, position);
}
}
最后進入到了settings-->onHeaderClick 做處理,當然叫到了preferenceActivity的 onHeaderClick 如果用戶指定了fragement. 哪就
startWithFragment(header.fragment, header.fragmentArguments, null, 0,
titleRes, shortTitleRes);
如果用戶沒指定,就直接啟動else if (header.intent != null) {
startActivity(header.intent);
}
以上就是settings啟動過程。 當然后續還會有進入fragement的動作。還有settings provider的數據庫存儲。先寫到這里。讓nancy瀏覽。
