作了一年多的Android開發,開始積累了一點Android開發方面的經驗。因此想抽點時間總結概括一下。
基本上全部的程序員,都有一種對美的追求。代碼所謂的美來自於抽象。要追求怎樣的美,怎樣的抽象,取決於:工做的現況,程序員的專業能力,性格與自個人要求。最重要的是,將代碼適度的抽象,進而轉化爲知識的積累,那是一趟自我不斷提高的美好旅程。 java
這個程序使用了github上的一個開源的sidebar框架,做者爲:Julian Chu (a.k.a walkingice) walkingice0204@gmail.com
項目的目錄結構如圖,
MainActivity和AnimationLayout是sidebar的關鍵部分,
workerService是業務邏輯模塊,毫無疑問MainActivity和兩個Fragment就是視圖模塊。
這樣設計的目的主要是爲了讓視圖和業務邏輯分離,全部的業務邏輯都在Service中,當Service中
處理完業務後,經過Broadcast通知Activity和Fragment改變UI,而Activity調用業務邏輯則經過Intent來
實現。 android
代碼明細
MainActivity
git
//初始化sidebar和Fragment組件 @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); IntentFilter filter = new IntentFilter(CHANGE_VIEW); receiver = new ChangeViewReceiver(); registerReceiver(receiver, filter); mLayout = (AnimationLayout) findViewById(R.id.animation_layout); mLayout.setListener(this); mList = (ListView) findViewById(R.id.sidebar_list); mList.setAdapter( new ArrayAdapter<String>( this, android.R.layout.simple_list_item_1 , mStrings)); final FragmentManager fm = getSupportFragmentManager(); mList.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view,int position, long id) { // TODO Auto-generated method stub String name=(String)parent.getAdapter().getItem(position); Log.i(TAG, "vlaue="+name+",position="+position+",id="+id); FragmentTransaction ft=fm.beginTransaction(); Fragment main=fm.findFragmentByTag("main"); if(main!=null){ ft.remove(main); } ft.add(R.id.animation_layout_content, switchFragment(position), "main"); ft.commit(); mLayout.closeSidebar(); } }); // mList.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE); }
//MainActivity中的BroadcastReceiver,用來接收Service發送過來的事件,並改變UI class ChangeViewReceiver extends BroadcastReceiver { @Override public void onReceive(Context ctx, Intent intent) { String action=intent.getAction(); Log.i("lcm", "ChangeViewReceiver,action="+action); if(action!=null){ if(action.equals(CHANGE_VIEW)){ String msg=intent.getStringExtra("msg"); if(msg.equals("viewid")){ FragmentManager fm = getSupportFragmentManager(); Fragment ft=fm.findFragmentByTag("main"); //動態改變Fragment中控件的狀態 LinearLayout viewRoot=(LinearLayout)ft.getView().findViewById(R.id.fragment_b_root); EditText edit=(EditText)viewRoot.findViewById(R.id.editText1); edit.setText("你好啊"); //或者也能夠動態的添加控件 // LinearLayout child=new LinearLayout(getApplicationContext()); // child.setLayoutParams(LP_FW); // child.setBackgroundResource(R.color.mybak); // viewRoot.addView(child); }else if(msg.equals("viewtag")){ } } } } }HelloFragment
//定義一個接口讓Activity來實現,就能夠方便的調用Activity中的資源 public interface OnArticleSelectedListener{ public void onArticleSelected(String action); }WorkerService
@Override public int onStartCommand(Intent intent, int flags, int startId) { // TODO Auto-generated method stub // return super.onStartCommand(intent, flags, startId); String action=intent.getAction(); Log.i("lcm", "action="+action); if(action.equals(CHANGE)){ //在這裏處理具體的業務邏輯,好比執行網絡操做,磁盤操做或者數據庫操做 //爲了簡單起見,這裏直接向Activity發送改變UI的廣播 sendBroadcast("viewid"); } return START_STICKY; }
完整的項目下載:
http://pan.baidu.com/share/link?shareid=3007225400&uk=1611114851
程序員
這個項目只是個人一點不成熟的想法,歡迎提出有用的建議,
關於爲何我沒有提取出一個公共的Fragment的問題,那是由於我如今開發的那個程序,跟oschina的手機客戶端業務相差很大,每一個界面的UI幾乎徹底不一樣,不像oschina每一個界面基本都是ListView。
github