通过获取Android应用程序列表谈MVC模式

来源:互联网 发布:暗访十年 知乎 编辑:程序博客网 时间:2024/04/28 00:25

MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。MVC被独特的发展起来用于映射传统的输入、处理和输出功能在一个逻辑的图形化用户界面的结构中。----引自百度百科。

网络上讲解MVC模式的文献一搜一大把,今天我们把理论与实际结合一下,通过获取Android手机应用列表来实际看一看什么是MVC,有问题大家一起交流。

整个程序分为三个文件MainActivity.java, AppInfoProvider.java, AppInfo.java,分别对应MVC中的View,Controller和Model,AppInfo.java定义了一个应用程序信息类,AppInfoProvider.java获取系统的应用列表,改变Model的数据,最后MainActivity.java用于显示改变后的数据(即获得的应用程序列表)。下面是代码,代码中有注释,比较简单,太详细的可以交流或者自行google:

MainActivity.java

package com.sun.baseadaptermvc;import java.util.List;import android.app.Activity;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.view.View;import android.view.ViewGroup;import android.widget.AdapterView;import android.widget.AdapterView.OnItemClickListener;import android.widget.BaseAdapter;import android.widget.ImageView;import android.widget.LinearLayout;import android.widget.ListView;import android.widget.TextView;import android.widget.Toast;/** * MVC中的View(视图),将获得Model(即APPInfo在这里)对象列表显示在View界面里面。 *  * @author 孙世华 *  */public class MainActivity extends Activity {private List<AppInfo> appInfos;private AppInfoProvider provider;private ListView mylist;private LinearLayout ll_app_manager_loading;private MyAdapter adapter;private Handler handler = new Handler() {@Overridepublic void handleMessage(Message msg) {super.handleMessage(msg);ll_app_manager_loading.setVisibility(View.INVISIBLE);adapter = new MyAdapter();mylist.setAdapter(adapter);}};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);provider = new AppInfoProvider(this);mylist = (ListView) findViewById(R.id.mylist);ll_app_manager_loading = (LinearLayout) findViewById(R.id.ll_app_manager_loading);initUI();mylist.setOnItemClickListener(new OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> arg0, View view, int position, long id) {// TODO Auto-generated method stubAppInfo appInfo = (AppInfo) mylist.getItemAtPosition(position);Toast.makeText(getApplicationContext(), "您选择了" + appInfo.getName(), Toast.LENGTH_SHORT).show();}});}private void initUI() {// ll_app_manager_loading.setVisibility(View.VISIBLE);new Thread() {@Overridepublic void run() {appInfos = provider.getAllApps();handler.sendEmptyMessage(0);}}.start();}private class MyAdapter extends BaseAdapter {@Overridepublic View getView(int position, View convertView, ViewGroup parent) {// TODO Auto-generated method stubView view = null;if (convertView == null) {view = View.inflate(getApplicationContext(), R.layout.app_item, null);} else {view = convertView;}// 更改View对象的状态AppInfo info = appInfos.get(position);ImageView iv = (ImageView) view.findViewById(R.id.iv_app_icon);TextView tv = (TextView) view.findViewById(R.id.tv_app_name);iv.setImageDrawable(info.getIcon());tv.setText(info.getName());return view;}@Overridepublic long getItemId(int position) {// TODO Auto-generated method stubreturn position;}@Overridepublic Object getItem(int position) {// TODO Auto-generated method stubreturn appInfos.get(position);}@Overridepublic int getCount() {// TODO Auto-generated method stubreturn appInfos.size();}}}

AppInfoProvider.java

package com.sun.baseadaptermvc;import java.util.ArrayList;import java.util.List;import android.content.Context;import android.content.pm.ApplicationInfo;import android.content.pm.PackageInfo;import android.content.pm.PackageManager;import android.graphics.drawable.Drawable;/** * MVC中的Controller(控制器),获取Model对象列表数据,并返回最终修改(获得的)的AppInfo对象列表。 *  * @author 孙世华 *  */public class AppInfoProvider {private Context context;private PackageManager packageManager;public AppInfoProvider(Context context) {// super();this.context = context;this.packageManager = context.getPackageManager();}public List<AppInfo> getAllApps() {List<AppInfo> listinfos = new ArrayList<AppInfo>();List<PackageInfo> packageInfos = packageManager.getInstalledPackages(PackageManager.GET_UNINSTALLED_PACKAGES);for (PackageInfo packageInfo : packageInfos) {AppInfo myApp = new AppInfo();ApplicationInfo appinfo = packageInfo.applicationInfo;Drawable icon = appinfo.loadIcon(packageManager);myApp.setIcon(icon);String appname = appinfo.loadLabel(packageManager).toString();myApp.setName(appname);String packname = packageInfo.packageName;myApp.setPackname(packname);listinfos.add(myApp);}return listinfos;}}

AppInfo.java

package com.sun.baseadaptermvc;import android.graphics.drawable.Drawable;/** * 应用程序实体 * MVC中的Model(模型),用于建立一个模型对象实体,在此处就是要显示的应用程序的图标和应用程序名称 * @author 孙世华 *  */public class AppInfo {private Drawable icon;private String name;private String packname;public Drawable getIcon() {return icon;}public void setIcon(Drawable icon) {this.icon = icon;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getPackname() {return packname;}public void setPackname(String packname) {this.packname = packname;}}

布局文件有两个,activity_main.xml和app_item.xml,其余的不重要的xml文件就不列了:

activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="horizontal"    tools:context="com.sun.baseadaptermvc.MainActivity" >    <ListView        android:id="@+id/mylist"        android:layout_width="match_parent"        android:layout_height="match_parent" >    </ListView>    <LinearLayout        android:id="@+id/ll_app_manager_loading"        android:layout_width="match_parent"        android:layout_height="match_parent"        android:gravity="center_vertical|center_horizontal"        android:orientation="vertical"        android:visibility="invisible" >        <ProgressBar            android:id="@+id/pb_app_manager"            android:layout_width="60dp"            android:layout_height="60dp" />        <TextView            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:text="正在拼了命加载..."            android:textColor="@android:color/black"            android:textSize="18sp" />    </LinearLayout></LinearLayout>

app_item.xml:

<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="fill_parent"    android:layout_height="65dip"    android:background="@drawable/item_background_selector"    android:gravity="center_vertical" >    <ImageView        android:id="@+id/iv_app_icon"        android:layout_width="60dip"        android:layout_height="60dip"        android:layout_alignParentLeft="true"        android:scaleType="fitXY"        android:src="@drawable/ic_launcher" />    <TextView        android:id="@+id/tv_app_name"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_toRightOf="@id/iv_app_icon"        android:paddingLeft="5dp"        android:text="功能名字"        android:textColor="@color/textcolor"        android:textSize="22sp" /></RelativeLayout>
结果如下:



    

为方便学习交流,源代码已经上传至:http://download.csdn.net/detail/sunshihua12829/9488758

0 0