转载自:http://www.cnblogs.com/nan-jing/archive/2013/05/20/3088280.html
分析下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浏览。