博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android MVC之我的实现
阅读量:5729 次
发布时间:2019-06-18

本文共 3626 字,大约阅读时间需要 12 分钟。

hot3.png

做了一年多的Android开发,开始积累了一点Android开发方面的经验。所以想抽点时间总结归纳一下。

基本上所有的程序员,都有一种对美的追求。代码所谓的美来自於抽象。要追求怎样的美,怎样的抽象,取决於:工作的现况,程序员的专业能力,性格与自我的要求。最重要的是,将代码适度的抽象,进而转化为知识的积累,那是一趟自我不断提升的美好旅程。

这个程序使用了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来
实现。

代码明细

MainActivity

//初始化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
( 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;	}

完整的项目下载:

这个项目只是我的一点不成熟的想法,欢迎提出有用的建议,

关于为什么我没有提取出一个公共的Fragment的问题,那是因为我现在开发的那个程序,跟oschina的手机客户端业务相差很大,每个界面的UI几乎完全不同,不像oschina每个界面基本都是ListView。

转载于:https://my.oschina.net/wiselyming/blog/150034

你可能感兴趣的文章
electron程序保护措施(崩溃监控,开机自启,托盘关闭)
查看>>
AIOps 在腾讯的探索和实践
查看>>
使用NetworkX模块绘制深度神经网络(DNN)结构图
查看>>
解读 React 的 pooledClass.js
查看>>
深入理解ES6笔记(十一)代理(Proxy)和反射(Reflection)API(12)
查看>>
华为 深信服等研发面经
查看>>
python爬虫解决网页重定向问题
查看>>
Egg.js搭建后台服务API
查看>>
node工具模块
查看>>
Go基础学习记录 - 编写Web应用程 - Web开发输入验证(二)
查看>>
以太坊开发实战学习-ERC721标准(七)
查看>>
babel-present-env 与 babel-polyfill 学习总结
查看>>
ES6 的解构赋值前每次都创建一个对象吗?会加重 GC 的负担吗?
查看>>
Episode 1:正视微信(试播)
查看>>
idea安装和使用
查看>>
粤省事:随时、随地、随处的便民解决方案
查看>>
基于OGG Datahub插件将Oracle数据同步上云
查看>>
PHP回顾之流
查看>>
低延时的P2P HLS直播技术实践
查看>>
浅谈vue中style的scoped属性(修改特定Element组件样式的方法)
查看>>