




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、软件体系结构大作业报告姓 名: 刘敏 学 号: 1305110145 班 级: 软件工程1303班 院 系: 数学与计算机学院 日 期: 2016-06-04 任课教师: 丁月华 目录一、 引言··································
2、;···························031.1、 软件名称·····················
3、·································031.2、 软件作用···············&
4、#183;······································031.3、编写目的·········
5、83;··············································031.4、定义··&
6、#183;·················································&
7、#183;·······031.5、运行环境········································
8、83;···············031.6、参考资料·································
9、;·······················03二、 系统需求分析·························
10、····························042.1、任务概述····················
11、183;···································042.1.1、目标············
12、3;··········································042.1.2、用户特点·····
13、3;·············································042.1.3、假定和约束··
14、83;··············································042.2、需求规定··
15、;··················································
16、;····042.2.1、对功能的规定···········································
17、83;···042.2.2、输入输出要求············································&
18、#183;··05三、 系统设计分析·············································
19、183;·······053.1、概要设计········································
20、3;···············053.1.1、基本设计概念和处理流程·······························
21、83;·····053.1.2、系统数据说明··········································&
22、#183;····053.1.3、系统出错处理设计··········································
23、83;063.2、详细设计················································
24、;········063.2.1、系统类图········································
25、;···········063.2.2、功能·····································&
26、#183;·················083.2.3、设计模式······························&
27、#183;····················09四、 系统实现···························
28、3;·····························144.1、实验截图···················
29、·····································144.2、部分代码示例···········
30、·········································16五、 实验总结·······
31、83;·················································22A
32、ndroid软件-天天动听一、 引言1.1、 软件名称天天动听(音乐播放器)1.2、 软件作用该款APP是仿天天动听软件做出来的,其中实现了天天动听音乐播放器的部分功能,读取手机里面的音乐并播放分类、排列歌曲和自己设置皮肤。1.3、 编写目的随着越来越多的音乐播放软件的横行,现在需要一款不一样的音乐播放软件,虽然该软件的功能还存在很大的不足,但会在后来慢慢补充进的。而且对于android初学者来说,自己动手编写一款音乐播放器对自己能力的提升有很大的帮助,能更好地掌握学到的知识。1.4、定义我的音乐:指读取到的本机上的所有音乐。我的最爱:指对我的音乐中自己喜欢的音乐进行标注后,该音乐进入到我的最
33、爱这一分类中。文件夹:指读取到的音乐的路径,音乐在内存卡中的位置。歌手:指歌曲的歌唱者,在该功能块中是根据歌手进行分类的。专辑:指歌曲是根据歌曲还是录音或是其他等分类的。更多:指在首页的翻页功能,翻页后就有许多小功能块,这些功能块用来进行系统设置。1.5、 运行环境安装有SDK 的Eclipse环境下,用虚拟机进行运行1.6、 参考资料参考书籍:l 软件架构设计 温昱 电子工业出版社 2007-3l 面向模式的软件体系结构 卷1:模式系统 Frank Buschmann, Regine Meunier, Hans Rohnert, Peter Sornmerlad, Michael Stal著
34、, 1996. 译者:贲可荣 郭福亮 等)l 面向模式的软件体系结构 卷2:用于并发和网络化对象的模式 Douglas Schmidt, Michael Stal, Hans Rohnert, Frank Buschmann, 著, 1996.l 面向模式的软件体系结构 卷3:资源管理模式 机械工业出版社 2005-10l 易学设计模式 人民邮电出版社参考网站:下载频道:l 豆丁网 二、系统需求分析2.1、任务概述2.1.1、目标让编写者编写的这款软件能更好的为其他人看懂,是其他人了解基本流程,是软件测试时更方便。2.1.2、用户特点任何喜欢听音乐的用户。2.1.3、假
35、定和约束假定此款音乐播放器不需要用户登录,任何人都可随意使用,即没有对用户进行约束;假定音乐播放器不需要连接网络,只能播放本地音乐,即对播放的音乐进行了约束。2.2、需求规定2.2.1、对功能的规定播放功能:在我的音乐、我的最爱、文件夹、歌手、专辑这几个功能分块中都有播放音乐的功能。音乐分类:该软件先读取本机上的音乐,然后对其进行分类,分别放在我的音乐、我的最爱、文件夹、歌手、专辑中。系统功能:对整个系统进行设置,可以扫描歌曲、歌曲循环方式、换背景图片等。2.2.2、 输入输出要求 本系统中只有在导航条出有输入输出的要求,输入歌曲名称,输出歌曲信息。还有在睡眠功能处也有输入输出要求,输入等待时
36、间,输出:在刚刚输入的等待时间内就会退出系统。三、系统设计分析3.1、概要设计3.1.1、基本设计概念和处理流程3.1.2、系统数据说明该系统的数据均放在该工程目录下的res文件夹中,如下图所示: 3.1.3、系统出错处理····················· ··········
37、183;············由于该系统并为具体完善,只能是现部分功能,还有许多功能没有实现,此款音乐播放软件并不像酷狗音乐那么强大,因此出错是在所难免的。比如该系统的导航条的功能就不能实现,并不能够实现搜索的功能,还有在扫面歌曲这一块也不能真正的扫面,扫面过后就闪退,最重要的是该APP不能连接网络。虽然该APP有许多易错模块,但对于初步的实现功能还是可以的。3.2、详细计化········
38、183;················································3.2.1、系统
39、类图·················································
40、3;·····系统类图是通过逆向工程导出来的,便于分析研究整个系统的制作过程,以及各类之间的关系可以一目了然的出现。由于该系统的整体类图太大且太过复杂,现在只列出几种3.2.2、功能以下介绍几个重点功能。欢迎界面IPO图描述表模块编号:S1模块名称:欢迎界面模块描述:欢迎界面,提示用户进入程序输入参数:无输出参数:无 主界面IPO图描述表模块编号:S2模块名称:主界面模块描述:主界面,用户进入程序后所展示的功能界面输入参数:无输出参数:无 我的音乐IPO图描述表模块编号:S3模块名称:我的音乐界面所属子系统:主界面模块描述:我的音乐功能,里面是
41、已读取到的手机内存中的音乐输入参数:无输出参数:无 导航条IPO图描述表模块编号:S4模块名称:导航条所属子系统:我的音乐界面模块描述:用户可在导航条里搜索需要查找的音乐输入参数:音乐歌曲名称输出参数:该歌曲信息更多IPO图描述表模块编号:S5模块名称:更多所属子系统:主界面模块描述:该功能是整个APP的系统设置,功能描述:在该界面中可以进行扫描歌曲、列表循环设置、更换背景图片、睡眠、系统详细设置、退出这几个方面的功能。3.2.3、 设计模式 设计模式是一套被反复使用、多人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性,更有助于
42、对框架结构的理解。在此系统中,根据其逆向导出的类图和程序代码分析可知,该系统中主要使用了如下几种设计模式(现只列出其中几种)单件模式(Singleton)意图:确保一 个类只有一个实例,并提供一个全局访问点适用性:1、当类是能有一个实例且客户可以从一个众所周知的访问点访问它时。 2、当这个唯一实例应该通过子类化可拓展的,并且客户应该无需更改代码就能使用一个拓展的实例结构图:在此系统中的单例代码:Public class DatabaseHelper extends SQLiteOpenHelper ······private stat
43、ic DatabaseHelper mHelper;public static SQLiteDatabase getInstance(Context context) if (mDb = null) mDb = getHelper(context).getWritableDatabase();return mDb;······外观模式(Facade)定义:为子系统中的各类(或结构与方法)提供一个简明一致的界面,隐藏子系统的复杂性,使系统更加容易使用。适用性:1、为一个复杂子系统提供一个简单接口 2、提高子系统的独立性 3、在层次化结构
44、中,可以使用Façade模式定义系统中每一层的入口。结构图:在此系统中的代码:外观类:MusicUtilspublic class MusicUtils implements IConstants ······private static MusicInfoDao mMusicInfoDao;private static AlbumInfoDao mAlbumInfoDao;private static ArtistInfoDao mArtistInfoDao;private static FolderInfoDao mFo
45、lderInfoDao;private static FavoriteInfoDao mFavoriteDao;······public static List<ArtistInfo> queryArtist(Context context) if(mArtistInfoDao = null) mArtistInfoDao = new ArtistInfoDao(context);Uri uri = MediaStore.Audio.Artists.EXTERNAL_CONTENT_URI;ContentResolver
46、cr = context.getContentResolver();if (mArtistInfoDao.hasData() return mArtistInfoDao.getArtistInfo(); else List<ArtistInfo> list =getArtistList(cr.query(uri,proj_artist,null, null, MediaStore.Audio.Artists.NUMBER_OF_TRACKS+ " desc");mArtistInfoDao.saveArtistInfo(list);return list;pub
47、lic static List<AlbumInfo> queryAlbums(Context context)······public static ArrayList<MusicInfo>queryMusic(Context context) ······public static List<MusicInfo> queryFavorite(Context context) ·····
48、183;public static List<FolderInfo> queryFolder(Context context)············子系统:该子系统中有五个子类MusicInfoDao、AlbumInfoDao、ArtistInfoDao、FolderInfoDao、FavoriteInfoDao。模板方法模式(Template Method)定义:该模式首先定义特定的步骤的算法骨架,而将一些步骤延迟到子类中去实现,使得子类可以不改变一个算法的结
49、构即可从新定义该算法的某些特定步骤。适应性:1、一次性实现一个算法的不变部分,并将可变的算法留给子类来实现。 2、各子类中公共的行为应该被提取出来并集中一个公共父类中以避免代码重复。 3、可以控制子类拓展。结构图:在此系统中的满足该模式的UML类图:备忘录模式(Memento)定义:在不破坏封闭的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样以后就可以将该对象恢复到原先保存的状态。适用性:1、功能比较复杂的,但是需要维护或记录属性历史的类。 2、需要保存的属性只是众多属性的一小部分。结构图:在此系统中满足该模式的UML类图:优点:1、备忘录模式使用备忘录可以把原发者的内部状态
50、保存起来,使得只有很“亲密的”的对象可以访问备忘录中的数据。2、有时一些发起人对象的内部信息必须保存在发起人对象以外的地方,但是必须要由发起人对象自己读取,这时,使用备忘录模式可以把复杂的发起人内部信息对其他的对象屏蔽起来,从而可以恰当地保持封装的边界。3、本模式简化了发起人类。发起人不再需要管理和保存其内部状态的一个个版本,客户端可以自行管理他们所需要的这些状态的版本。4、当发起人角色的状态改变的时候,有可能这个状态无效,这时候就可以使用暂时存储起来的备忘录将状态复原。缺点:1、如果发起人角色的状态需要完整地存储到备忘录对象中,那么在资源消耗上面备忘录对象会很昂贵。 2、当负责人角色将一个备
51、忘录 存储起来的时候,负责人可能并不知道这个状态会占用多大的存储空间,从而无法提醒用户一个操作是否很昂贵。 3、当发起人角色的状态改变的时候,有可能这个协议无效。如果状态改变的成功率不高的话,不如采取“假如”协议模式。迭代器模式(Iterator)意图:提供一种方法顺序访问一个聚合对象中各个元素,而又不需暴露该对象的内部表示。适用性:1、访问一个聚合对象的内容而无需暴露它的内部表示 2、支持对聚合对象的多种遍历 3、为遍历不同的聚合结构提供一个统一的接口结构图:在此系统中满足该模式的类及代码:MusicUtils类public class MusicUtils implements ICons
52、tants ······public static ArrayList<MusicInfo> getMusicList(Cursor cursor) if (cursor = null) return null;ArrayList<MusicInfo> musicList = new ArrayList<MusicInfo>();while (cursor.moveToNext() ······Cursor.close();return m
53、usicList;·······MusicInfoDao类public class MusicInfoDao implements IConstants private List<MusicInfo> parseCursor(Cursor cursor) List<MusicInfo> list = new ArrayList<MusicInfo>();while(cursor.moveToNext() ······cursor.
54、close();return list;······ArtistInfoDao类public class ArtistInfoDao public List<ArtistInfo> getArtistInfo() ······Cursor cursor = db.rawQuery(sql, null);while(cursor.moveToNext() ······cursor.close();retur
55、n list;除以上几个类中有该模式外,还有FavoriteInfoDao、FolderInfoDao、AlbumInfoDao等类中也有该模式。四、系统实现4.1、实验截图欢迎界面 主界面 我的音乐界面 播放界面 翻页 扫描歌曲界面 换背景图片界面 设置界面 4.2、部分代码示例SuppressLint("HandlerLeak")public class MainContentActivity extends FragmentActivity implements IConstants public static final String ALARM_CLOCK_BRO
56、ADCAST = "alarm_clock_broadcast"public SlidingMenu mSlidingMenu;private List<OnBackListener> mBackListeners = new ArrayList<OnBackListener>();public MainFragment mMainFragment;private Handler mHandler;private MusicInfoDao mMusicDao;private SplashScreen mSplashScreen;private int
57、 mScreenWidth;public interface OnBackListener public abstract void onBack();Overrideprotected void onCreate(Bundle arg0) super.onCreate(arg0);DisplayMetrics metric = new DisplayMetrics();getWindowManager().getDefaultDisplay().getMetrics(metric);mScreenWidth = metric.widthPixels;initSDCard();IntentFi
58、lter filter = new IntentFilter();filter.addAction(ALARM_CLOCK_BROADCAST);registerReceiver(mAlarmReceiver, filter);setContentView(R.layout.frame_main);mSplashScreen = new SplashScreen(this);mSplashScreen.show(R.drawable.image_splash_background,SplashScreen.SLIDE_LEFT);/ set the Above ViewmMainFragmen
59、t = new MainFragment();getSupportFragmentManager().beginTransaction().replace(R.id.frame_main, mMainFragment).commit();/ configure the SlidingMenumSlidingMenu = new SlidingMenu(this);mSlidingMenu.setTouchModeAbove(SlidingMenu.TOUCHMODE_MARGIN);mSlidingMenu.setMode(SlidingMenu.RIGHT);mSlidingMenu.set
60、ShadowWidthRes(R.dimen.shadow_width);mSlidingMenu.setShadowDrawable(R.drawable.shadow);mSlidingMenu.setBehindOffsetRes(R.dimen.slidingmenu_offset);mSlidingMenu.setFadeDegree(0.35f);mSlidingMenu.attachToActivity(this, SlidingMenu.SLIDING_CONTENT);mSlidingMenu.setMenu(R.layout.frame_menu);getSupportFr
61、agmentManager().beginTransaction().replace(R.id.frame_menu, new MenuFragment().commit();mMusicDao = new MusicInfoDao(this);mHandler = new Handler() Overridepublic void handleMessage(Message msg) super.handleMessage(msg);mSplashScreen.removeSplashScreen();getData();private void initSDCard() IntentFil
62、ter intentFilter = new IntentFilter();intentFilter.setPriority(1000);/ 设置最高优先级intentFilter.addAction(Intent.ACTION_MEDIA_MOUNTED);/ sd卡被插入,且已经挂载intentFilter.addAction(Intent.ACTION_MEDIA_UNMOUNTED);/ sd卡存在,但还没/有挂载intentFilter.addAction(Intent.ACTION_MEDIA_REMOVED);/ sd卡被移除intentFilter.addAction(Inte
63、nt.ACTION_MEDIA_SHARED);/ sd卡作为/ USB大容量存储被共享,挂载被解除intentFilter.addAction(Intent.ACTION_MEDIA_BAD_REMOVAL);/ sd卡已经从sd卡插槽拔出,但是挂载点还没解除/ intentFilter.addAction(Intent.ACTION_MEDIA_SCANNER_STARTED);/ 开始扫描/ intentFilter.addAction(Intent.ACTION_MEDIA_SCANNER_FINISHED);/ 扫描完成intentFilter.addDataScheme("
64、;file");registerReceiver(sdCardReceiver, intentFilter);/ 注册监听函数private void getData() new Thread(new Runnable() Overridepublic void run() if (mMusicDao.hasData() / 如果有数据就等三秒跳转mHandler.sendMessageDelayed(mHandler.obtainMessage(), 3000); else MusicUtils.queryMusic(MainContentActivity.this,START_F
65、ROM_LOCAL);MusicUtils.queryAlbums(MainContentActivity.this);MusicUtils.queryArtist(MainContentActivity.this);MusicUtils.queryFolder(MainContentActivity.this);mHandler.sendEmptyMessage(1);).start();public void registerBackListener(OnBackListener listener) if (!mBackListeners.contains(listener) mBackL
66、isteners.add(listener);public void unRegisterBackListener(OnBackListener listener) mBackListeners.remove(listener);Overridepublic void onBackPressed() if (mSlidingMenu.isMenuShowing() mSlidingMenu.showContent(); else if (mBackListeners.size() = 0) / super.onBackPressed();/ 在activity中调用 moveTaskToBac
67、k (boolean nonRoot)方法即可将activity/ 退到后台,注意不是finish()退出。/ 参数为false代表只有当前activity是task根,指应用启动的第一个activity时,才有效;moveTaskToBack(true);for (OnBackListener listener : mBackListeners) listener.onBack();private final BroadcastReceiver sdCardReceiver = new BroadcastReceiver() Overridepublic void onReceive(Con
68、text context, Intent intent) String action = intent.getAction();if (action.equals("ent.action.MEDIA_REMOVED")/ 各种未挂载状态| action.equals("ent.action.MEDIA_UNMOUNTED")| action.equals("ent.action.MEDIA_BAD_REMOVAL")| action.equals("andro
69、ent.action.MEDIA_SHARED") finish();Toast.makeText(MainContentActivity.this, "SD卡以外拔出,本地数据没法初始化!",Toast.LENGTH_SHORT).show();public void showSleepDialog() if (MusicApp.mIsSleepClockSetting) cancleSleepClock();Toast.makeText(getApplicationContext(), "已取睡眠模式!",Toast.LENGT
70、H_SHORT).show();return;View view = View.inflate(this, R.layout.sleep_time, null);final Dialog dialog = new Dialog(this, R.style.lrc_dialog);dialog.setContentView(view);dialog.setCanceledOnTouchOutside(false);Window dialogWindow = dialog.getWindow();WindowManager.LayoutParams lp = dialogWindow.getAtt
71、ributes();dialogWindow.setGravity(Gravity.CENTER);/ lp.x = 100; / 新位置X坐标/ lp.y = 100; / 新位置Y坐标lp.width = (int) (mScreenWidth * 0.7); / 宽度/ lp.height = 400; / 高度/ 当Window的Attributes改变时系统会调用此函数,可以直接调用以应用上面对窗口参数的更改,也可以用setAttributes/ dialog.onWindowAttributesChanged(lp);dialogWindow.setAttributes(lp);d
72、ialog.show();final Button cancleBtn = (Button) view.findViewById(R.id.cancle_btn);final Button okBtn = (Button) view.findViewById(R.id.ok_btn);final EditText timeEt = (EditText) view.findViewById(R.id.time_et);OnClickListener listener = new OnClickListener() Overridepublic void onClick(View v) if (v
73、 = cancleBtn) dialog.dismiss(); else if (v = okBtn) String timeS = timeEt.getText().toString();if (TextUtils.isEmpty(timeS)| Integer.parseInt(timeS) = 0) Toast.makeText(getApplicationContext(), "输入无效!",Toast.LENGTH_SHORT).show();return;setSleepClock(timeS);dialog.dismiss();cancleBtn.setOnC
74、lickListener(listener);okBtn.setOnClickListener(listener);/ 设置睡眠闹钟 private void setSleepClock(String timeS) Intent intent = new Intent(ALARM_CLOCK_BROADCAST);PendingIntent pendingIntent = PendingIntent.getBroadcast(MainContentActivity.this, 0, intent, 0);/ 设置time时间之后退出程序int time = Integer.parseInt(t
75、imeS);long longTime = time * 60 * 1000L;AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);am.set(AlarmManager.RTC, System.currentTimeMillis() + longTime,pendingIntent);MusicApp.mIsSleepClockSetting = true;Toast.makeText(getApplicationContext(), "将在"+timeS+"分钟后退出软件", Toast.LENGTH_SHORT).show(); / 取消睡眠闹钟private vo
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 《微专题小练习》英语 详解答案
- 2024年供应链行业的创新案例分析试题及答案
- 2025年永磁无刷直流电动机项目发展计划
- 2025年全自动变焦照相机合作协议书
- 数字化时代的仓储技术挑战试题及答案
- CPSM考试趋势与试题及答案
- 广西桂林十八中2025年高考冲刺化学模拟试题含解析
- 树木生长的生理基础与影响因素试题及答案
- 2025届江苏省苏、锡、常、镇高三(最后冲刺)化学试卷含解析
- 考生必看CPMM试题及答案
- 半月板损伤教学查房课件
- 2023年江苏省镇江市中考一模语文试题(解析版)
- 平北黄岩油气田群调整井项目(第一批)环评报告
- 过程审核检查表-示例
- 《口腔医学课件:正畸治疗方案设计与矫治技术分析》
- 专职安全管理机构设置文件范本
- 谈判:如何在博弈中获得更多
- 复方氨基酸注射液的汇总
- 门窗设计师职位描述与岗位职责
- SYB创业培训游戏模块2课件
- 美国密码法律制度概览 2023
评论
0/150
提交评论