android心得体会

2024-10-16

android心得体会(通用7篇)

1.android心得体会 篇一

Android实习心得

刚开始接触Android感觉到它很有意思,在界面开发上和web也可以形成了相通的架构,更加方便,视觉上也是非常的酷,在前期我通过的大量的Android SDK开发范例大全中的例子以及Android提供的APIDEMOS进行学习,尽管例子之间的连接比较零散,不过通过这些例子的学习我可以学习到了很多和以前java上相通的思想。

我在为期半个月的实习中学到了很多在课堂上根本就学不到的知识,收益非浅.现在我对这半个月的实习做一个工作小结。

1通过半个月的android实习,基本掌握了Android应用程序开发的一般流程。对常用控件基本掌握其用法,对其事件的监听方法也基本掌握。学习Android不仅是对前沿开发技术的了解,也是对编程知识的一次提升。

2通过学习Android的控件、布局、Activity、Service等一系列基础知识,对整个Android的开发有了大致的了解。例如: 要的布局(或者控件),在学习界面中,我发现Android为我们提供了很好的类似反射机制,通过Layout文件夹下的配置文件,可以快速的形成界面,在配置文件可以设置属性或者样式都是很快捷方便。对比较特殊的界面也可以通过处理嵌入到指定的界面,同样你可以通过java代码直接创建View进行添加,不过这种方式比较复杂。对一些点击、选中、按键等处理的事件,界面之间的跳转Intent管理,通过Bundle对数据在界面之间进行传输。

4在手机交互式通信服务中,学习了Android手机之间进行短信发送、广播、对广播的监听、服务等,在Service类中没有context,可以通过Handler来每秒反复运行,自动送出系统广播信息,同时在这里我们也知道可以设计一个常用的变量类,设计一个当前的CurrentActivity这个变量进行控制,进行处理。

在Android编程过程中巩固熟悉了Java的编程。由于Android应用程序的开发离不开Java的支持,所以基础的Java知识是必须的。Android系统是基于Linux的手机操作系统平台,要深入系统的学习Android,不仅仅是有Java和Android应用开发,必须要具备Linux,C/C++高级编程才能深入的涉及Android Framework和Android内核开发。成为Android开发的高素质人才。所以,在后续对Android的学习中可能会看一些较底层的书籍。

由于这次实习时间较短,对于Android应用程序的高级编程讲的很少,是这次实习中的不足。要想开发一些好的应用程序,还需要更多的知识支持。在做实习最后的项目时,遇到了很多平时没有遇到或者没有特别关注的问题,如常见的Activity忘记注册,对SD卡存取需要权限,在写SQL语句时细微的错误就可能导致程序运行错误。这些问题只有自己在实际开发中才能体会到并且解决,并且在解决后可以长时间的记住。

通过Android的实习,我们在大四毕业前,我们又掌握了一项新的前沿的开发技能,也有了更多的发展方向,这在以后的找工作的过程中无疑为我们增加了砝码,也可以成为我们的一项兴趣爱好,可以根据我们自己的需要设计一些小的程序。总之,在这次实习中,我获得了很多东西,提高了自己的编程技巧和编程方法,并且认识了Android应用程序的开发,以及加深了对Java的认识。

最后,通过实习,我收获了很多东西,特别是编程方面的,这对即将毕业的我们来说,这次实习是一次较为珍贵的充电,

2.android心得体会 篇二

关于Android单元测试可以看Google官方给的教程:Best Practices for Testing(需要FQ)

一、创建Android Test Project

1、创建一个Android Project:Hello。并将其布局文件改成如下:

复制代码

1

2xmlns:tools=“schemas.android.com/tools”

3android:layout_width=“match_parent”

4android:layout_height=“match_parent”

5android:orientation=“vertical” >

6

7

8android:id=“@+id/text”

9android:layout_width=“match_parent”

10android:layout_height=“wrap_content”

11android:text=“@string/hello_world” />

12

13

14

15android:id=“@+id/edit”

16android:layout_width=“match_parent”

17android:layout_height=“wrap_content”

18android:hint=“请输入” />

19

20

复制代码

2、创建Hello对应的测试项目:File->New->Other->Android->Android Test Project,弹出”New Android Test Project”对话框,在“Project Name”中输入“HelloTest”,点击“Next”。

3、在”Select Test Target”中,选中你要测试的Android项目,然后点击Finish即可。

创建完Android Test Project后,打开HelloTest项目的AndroidManifest.xml文件,你会发现里面的配置会比HelloTest多,具体不同请看下面的代码:

复制代码

1

2

3package=“com.lsj.hello.test”

4android:versionCode=“1”

5android:versionName=“1.0” >

6

7

8

9

10

11

12android:name=“android.test.InstrumentationTestRunner”

13android:targetPackage=“com.lsj.hello” />

14

15

16android:icon=“@drawable/ic_launcher”

17android:label=“@string/app_name” >

18

19

20

21

22

复制代码

二、单元测试代码编写

1、创建完Android Test Project后,你会发现HelloTest自动帮你创建了com.lsj.hello.tests的包名。关于Android单元测试相关包、类、方法的命名方式如下:

包名:com.lsj.example————com.lsj.example.tests//对应包名+“.tests”

类名:Hello.java————HelloTest.java//对应类名+“Test”

方法名:Hello()————testHello()//“test”+对应方法名

2、在com.lsj.hello.tests包下建立MainActivityTest.java类,MainActivityTest继承自ActivityInstrumentationTestCase2,关于Android测试类可以看文章末尾的链接

3、编辑MainActivityTest,添加单元测试代码

复制代码

1 package com.lsj.hello.test;

2

3 import android.app.Instrumentation;

4 import android.test.ActivityInstrumentationTestCase2;

5 import android.view.KeyEvent;

6 import android.widget.EditText;

7 import android.widget.TextView;

8

9 import com.lsj.hello.MainActivity;

10

11 /**

12* ActivityInstrumentationTestCase2继承于TestCase, TestCase类位于junit.framework包下

13* 查阅Android API文档,可以发现Android的测试类全部继承自TestCase。 创建一个单元测试大致需要以下步骤:

14*

15*

16* 1、继承TestCase类或其子类

17* 2、定义要使用到的实例变量

18* 3、使用setUp()方法,在测试前的对变量和测试环境进行初始化

19* ....测试

20* 4、在测试完成后进行垃圾回收等善后工作

21*

22*

23* @author Lion

24*/

25 public class MainActivityTest extends

26ActivityInstrumentationTestCase2{

27

28private MainActivity mActivity;

29private TextView mTextView;

30private EditText mEditText;

31private Instrumentation mInstrumentation;

32

33/**

34* 重写MainActivityTest的构造方法,注意super内必须为内的泛型类,否则会报错,

35* 根据Google官方给的示例,其构造函数为午餐,而且测试的时候发现有参的构造函数会导致单元测试失败。

36*/

37public MainActivityTest() {

38super(MainActivity.class);

39}

40

41@Override

42protected void setUp() throws Exception {

43/* 执行对变量和测试环境的初始化 */

44super.setUp();

45// 关闭touch模式,否则key事件会被忽略

46setActivityInitialTouchMode(false);

47

48mInstrumentation = getInstrumentation();

49

50// 获取被测试的MainActivity

51mActivity = this.getActivity();

52// 获取被测试的TextView控件

53mTextView = (TextView) mActivity.findViewById(com.lsj.hello.R.id.text);

54// 获取被测试的EditText控件

55mEditText = (EditText) mActivity.findViewById(com.lsj.hello.R.id.edit);

56}

57

58/**

59* 测试数据初始化是否为空

60*/

61public void testInit() {

62// 断言mActivity是否为空

63assertNotNull(mActivity);

64// 断言mTextView是否为空

65assertNotNull(mTextView);

66// 断言mEditText是否为空

67assertNotNull(mEditText);

68}

69

70/**

71* 测试文本框字符串是否相等

72*/

73public void testTextViewString() {

74// 断言mTextView显示的文本是否与String.xml中的hello_world相等

75assertEquals(

76mActivity.getResources().getString(

77com.lsj.hello.R.string.hello_world), mTextView

78.getText().toString());

79}

80

81/**

82* 测试输入

83*/

84public void testEditTextInput() {

85input();

86assertEquals(“hello”, mEditText.getText().toString());

87}

88

89/**

90* 模拟输入

91*/

92public void input() {

93/* UI组件的相关操作需要在UI线程上进行,所以用Activity的runOnUiThread方法 */

94mActivity.runOnUiThread(new Runnable() {

95@Override

96public void run() {

97mEditText.requestFocus();

98mEditText.performClick();

99}

100});

101/*

102* 由于测试用例在单独的线程上执行,所以此处需要同步application,

103* 调用waitForIdleSync等待测试线程和UI线程同步,才能进行输入操作。

104* waitForIdleSync和sendKeys不允许在UI线程里运行

105*/

106mInstrumentation.waitForIdleSync();

107// 调用sendKeys方法,输入

108sendKeys(KeyEvent.KEYCODE_H, KeyEvent.KEYCODE_E, KeyEvent.KEYCODE_L,

109KeyEvent.KEYCODE_L, KeyEvent.KEYCODE_O);

110}

111

112@Override

113protected void tearDown() throws Exception {

114/* 在测试完成后进行垃圾回收等工作 */

115super.tearDown();

116}

3.android心得体会 篇三

Android.mk

LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE := geniusLOCAL_SRC_FILES := net_qiujuer_imageblurring_jni_ImageBlur.cppLOCAL_LDLIBS := -lm -llog -ljnigraphicsinclude $(BUILD_SHARED_LIBRARY)Application.mk

APP_ABI := allAPP_PLATFORM.:= android-19APP_OPTIM := release而这里这两个文件都没有建立,那么是怎么决定的呢?

我们可以在 ndk 的 modelName 上按住 Ctrl 进行点击将会出现这个界面:

这些就是全部能够设置的参数。分别对应:

ndk{moduleName JniDemo // 设置生成的文件名cFlags -DANDROID_NDK -D_RELEASE //这个对应的是生成模式ldLibs m, log, jnigraphics //这个对应 LOCAL_LDLIBS 但是需要去掉前面的 “l”abiFilters all //这个是对应的 APP_ABIstl stlport_shared //这个对应的是 APP_STL }

4.android心得体会 篇四

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

ForecastData situation = null;

................

Cursor cursor = mContext.getContentResolver().query(WEATHER_URI, null,

null, null, null);

try {

if (cursor != null && cursor.moveToFirst()) {

...........

cursor.close();

}

} catch (Exception e) {

e.printStackTrace();

} finally {

if (cursor != null) {

cursor.close();

}

}

return situation;

}

初看一下没有什么问题,但如果Cursor cursor = mContext.getContentResolver().query这里返回的错误还是会有可能造成程序的未关闭Cursor,因此我们改成标准写法:

?

1

2

3

4

5

6

7

8

9

Cursor cursor = null;

try {

cursor = getContentResolver().query(URI, .....);// 1

//dosomething

} finally {

if (cursor != null) {

cursor.close();// 2

}

}

这样改了之后,运行了很多个版本都一直没有问题,

android开发数据库Cursor 错误android.database.CursorWindowAll

,直到有一天一个同事发现可能查询数据库比较耗时。因此把方法放到线程里面去执行,而已每次查询的时候都会创建一个线程。没有想到上面代码又出错误了,如果您稍不留意不会怀疑这块代码的问题,因为try-finally写法不存在逻辑上的问题。由于这里未考虑到多线程场景,try-finally并不能保证query打开游标在dosomething时,被其他线程再次调用query打开游标。所以当遇到存在多线程的调用时必须对游标打开到关闭时间段添加锁,即这里是对try-finally块加锁。

下面简单解释一下:

假设:线程A执行到1处创建了一个Cursor,然后dosomething比较耗时........

线程B又来查询数据库,因此到1处又创建一个Cursor,此时如果AB执行完,就会关闭锁,看起来没有问题,但由于是同一个对象,所以AB关闭的cursor都是B创建的,因此

5.Android学习总结 篇五

零零碎碎的总结:

1.客户端的功能逻辑不难,UI界面也不难,但写UI花的时间是写功能逻辑的两倍.2.写代码前的思考过程非常重要,即使在简单的功能,也需要在本子上把该功能的运行过程写出来.3.要有自己的知识库,可以是一个工具类,把写过的,看过的好的代码放进去,也可以是一个笔记本软件.因为只有放在知识库里的东西,才是你最重要的财富.4.如果你想做自由职业者,你需要学英语,因为在国外的盈利比国内多很多.如果你想进大公司,好公司,你需要学英语.你想深入学习android,但中文的android文章太少了,你查查百度,到处都是copy来copy去的hellword,所以,你需要学英语.如果你想出国,你需要学英语.5.Http协议要研究透彻.http的信息头有什么信息,分别代表什么,信息体有什么信息,代表什么,都要搞的明明白白.scoket也是一样.6.在eclipse里的layout文件都有graphical Layout.通过这个好好的把UI调整好.7.Android里的junit每次运行都会打包新的apk到设备上跑.效率非常慢.如果是跟android无关的测试,最好自己建立一个单纯的java项目做测试.8.面试的时候不要觉得自己提的薪水太高,物以稀为贵明白吗?不管你的期望薪资多少,都有可能实现,这只是时间问题.9.如果一家小公司通过猎头找到你,即使公司在小,也比外面那些40,50人的公司还要好.不要觉得公司不行,担心会倒闭.放心吧,至少活1年是没问题的.10.不要把自己绑在android上,有空也研究下IOS(最近小弟就准备研究ios,刚买了6本书...).11.移动互联网最少还有10年的快速增长.android最少还有两年的快速增长.走android这条路是不会错的.12.有空多学点开放平台的SDK.比如新浪微博,腾讯微博,淘宝平台,支付宝移动支付平台,快钱移动支付平台等等..这些都是不愁没市场的.13.即使技术再差,也要发布一个应用到market上去.因为这样你才了解做一个应用的逻辑.14.每个月拿到薪水省500-1000元出来.这些钱投在买学习资料,去培训班上课...在培训班,花再多的钱也是值得的.15.你真正的价值在项目经验和对底层的认识上.不要忽略基础知识.16.如果有空把Android的源代码看一下.底层的东西很枯燥,但这些很值得学.17..程序员其实是艺术家.代码重构和设计模式,是非常非常重要的东西,必须要学

18.不要去维护一个项目,要去做一个项目.19.一开始不要轻易去大公司,虽然大公司是可以让你呆一辈子的.但你的起点低,以后成就也低.20:每天早上提前20分钟上班,5分钟把今天的工作计划写好.15分钟用来看各大It论坛的新闻.21:如果以前没做过java,那就把SSH看下,自己搭建一个小服务器.这是为了接私活用.22:PS一定要学,接私活用.23:多下载市面上好的应用,每天都用,只有这样你才能了解市场.现在所有的APK都可以反编译,看源代码麻烦,但看layout和图片很容易,所以....你懂的.24.要有羞耻心.25.老板仅仅要求你把东西做完,需求完成.但你必须对自己要更严格一点.写一段代码,从网上复制一份代码,并不是可以用就行了,你还必须明白他的原理,为什么这样就可以?这才是对你最有用的地方,这也是你今后薪资增长的保证.26.要懂得舍得.移动领域发展太快,必要时必须要用钱换时间.不然你会远远落后别人(我之前花了4000大洋去培训班学IOS三天).27.要明白自己想要什么,什么才能最大性价比提高你的能力.对我来说,能让我提高最大的,就是Android和IOS同时会,并且自己可以做架构设计.28.看android技术书籍最快的学习方法,先通读一次.然后把书本上的demo一个一个写出来.不要觉得太容易不去写.很多东西都是这样,看起来简单,但做起来难.最后再对照自己写出来的程序代码去理解书本的意思.29.应用和游戏是2个方向,没有一个公司会同时做游戏又做应用,即使是外包公司,大多也只做一块.专精一个就可以了.30.每次做完一个项目,要强迫自己做总结,通过这个项目,我学到了什么新技术?犯了哪些

SB错误?

6.Android面试总结 篇六

activity主要生命周期的方法说明:

onCreate(Bundle savedInstanceState):创建activity时调用。设置在该方法中,还以Bundle的形式提供对以前储存的任何状态的访问!

onStart():activity变为在屏幕上对用户可见时调用。

onResume():activity开始与用户交互时调用(无论是启动还是重新启动一个活动,该方法总是被调用的)。

onPause():activity被暂停或收回cpu和其他资源时调用,该方法用于保存活动状态的,也是保护现场,压栈吧!

onStop():activity被停止并转为不可见阶段及后续的生命周期事件时调用。

onRestart():重新启动activity时调用。该活动仍在栈中,而不是启动新的活动。

onDestroy():activity被完全从系统内存中移除时调用,该方法被

2.横竖屏切换时候activity的生命周期

3.android中的动画有哪几类,它们的特点和区别是什么

两种,一种是Tween动画、还有一种是Frame动画。Tween动画,这种实现方式可以使视图组件移动、放大、缩小以及产生透明度的变化;另一种Frame动画,传统的动画方法,通过顺序的播放排列好的图片来实现,类似电影。

{Android的animation由四种类型组成 XML中

alpha 渐变透明度动画效果 scale渐变尺寸伸缩动画效果

translate 画面转换位置移动动画效果 rotate 画面转移旋转动画效果

JavaCode中

AlphaAnimation ScaleAnimation 渐变透明度动画效果 渐变尺寸伸缩动画效果

TranslateAnimation画面转换位置移动动画效果 RotateAnimation 画面转移旋转动画效果

Android动画模式

Animation主要有两种动画模式: 一种是tweened animation(渐变动画)XML中 JavaCode alpha AlphaAnimation scaleScaleAnimation

一种是frame by frame(画面转换动画)XML中 JavaCode translate TranslateAnimation rotate RotateAnimation

}

4.handler机制的原理:

andriod提供了 Handler 和 Looper 来满足线程间的通信。Handler 先进先出原则。Looper类用来管理特定线程内对象之间的消息交换(Message Exchange)。

1)Looper: 一个线程可以产生一个Looper对象,由它来管理此线程里的Message Queue(消息队列)。

2)Handler: 你可以构造Handler对象来与Looper沟通,以便push新消息到Message Queue里;或者接收Looper从Message Queue取出)所送来的消息。

3)Message Queue(消息队列):用来存放线程放入的消息。

4)线程:UI thread 通常就是main thread,而Android启动程序时会替它建立一个Message Queue

5.说说activity,intent,service是什么关系

[教程] 新手入门之应用解析(Activity、Intent、Service等)

Activity, Intent, Service, IntentReceiver, ContentProvider 一般刚开始学Android时对这些基本的东西还是要明确一下的,下面的东西摘自新版android开发教程里面的,介绍比较简单,希望能够有帮助。

一、Activity

Activity是android中最今本的应用程序组件,应用程序中,一个Activity通常是一个单独的屏幕,每一个Activity都被实现为一个单独的类,这些类都是从Activity基类中继承来的,Activity类会显示由视图控件组成的用户接口,并对视图控件的事件做出响应。一个复杂的应用是由多个屏幕显示组成。这里每一个屏幕的显示就是一个Activity,从一个屏幕的显示到另一个新屏幕的显示并完成相关的事件是很容易实现的,这些屏幕Activity是相互交互的,他们直接通信从而完成相应的功能。当一个新的屏幕打开时,前一个屏幕将会暂停,并保存在历史堆栈中,用户可以从历史堆栈中返回前一个屏幕。当屏幕不再使用时,我们可以从历史堆栈中删除它,默认情况下,Android会保留从主屏幕到每一个应用的运行屏幕。Activity代表一个用户所能看到的屏幕,Activity主要是处理一个应用的整体性工作,如监听系统事件(按键、触摸屏幕等)、为用户显示指定的View、启动其他Activity等,其他的Activity继承Activity基类后,通过重写父类的方法来实现各种功能。

二、Intent

Android专有类Intent的调用是用来进行架构屏幕之间的切换的。Intent是描述应用想要做什么。Intent数据结构中两个最重要的部分是动作和动作对应的数据,典型的动作类型有:Main(活动的门户)、View、Pick、Edit等,而动作对应的数据是应URI的形式进行表示的,这里的URI就相当于这些动作的ID,一个动作对应一个动作数据。Android使用了Intent这个特殊类,实现在屏幕与屏幕之间的移动。Intent类用用来描述一个应用将会做什么事情。与之有关系的一个类叫IntentFilter类,相对于intent是一个有效的做事情的请求,一个IntentFilter则用于描述一个Activity(或者IntentReceiver)能够操作那些intent。一个Activity如果要显示一个人的联系方式时,需要事先声明一个IntentFilter,这个IntentFilter要知道怎么去处理View动作和表示一个人的URI,IntentFilter需要AndroidManifest.xml中 定义,如AndroidManifest.xml中的:

通过解析各种intent,从一个屏幕导航到另一个屏幕是很简单的。当向前导航时,activity 将会调用startActivity(IntentmyIntent)方法。然后,系统会在所有安装的应用程序中定义的IntentFilter 中查找,找到最匹配myIntent 的Intent 对应的activity。新的activity 接收到myIntent 的通知后,开始运行。当startActivity 方法被调用将触发解析myIntent 的动作,这个机制提供了两个关键好处:

A、Activities 能够重复利用从其它组件中以Intent 的形式产生的一个请求;

B、Activities 可以在任何时候被一个具有相同IntentFilter 的新的Activity 取代。

三、IntentReceiver

当你希望你的应用能够对一个外部的事件(如当电话呼入时,或者数据网络可用时,或者到了晚上时)做出响应,你可以使用一个IntentReceiver。虽然IntentReceiver 在感兴趣的事件发生时,会使用NotificationManage通知用户,但它并不能生成一个UI。IntentReceiver 在AndroidManifest.xml 中注册,但也可以在代码中使用Context.registerReceiver()进行注册。当一个intentreceiver 被触发时,你的应用不必对请求调用intentreceiver,系统会在需要的时候启动你的应用。各种应用还可以通过使用Context.broadcastIntent()将它们自己的intentreceiver 广播给其它应用程序。

四、Service

一个Service 是一段长生命周期的,没有用户界面的程序。比较好的一个例子就是一个正在从播放列表中播放歌曲的媒体播放器。在一个媒体播放器的应用中,应该会有多个activity,让使用者可以选择歌曲并播放歌曲。然而,音乐重放这个功能并没有对应的activity,因为使用者当然会认为在导航到其它屏幕时音乐应该还在播放的。在这个例子中,媒体播放器这个activity 会使用Context.startService()来启动一个service,从而可以在后台保持音乐的播放。同时,系统也将保持这个service 一直执行,直到这个service 运行结束。另外,我们还可以通过使用Context.bindService()方法,连接到一个service 上(如果这个service 还没有运行将启动它)。当连接到一个service 之后,我们还可以service 提供的接口与它进行通讯。拿媒体播放器这个例子来说,我们还可以进行暂停、重播等操作。

五、Content Provider

Android 应用程序能够将它们的数据保存到文件、SQLite 数据库中,甚至是任何有效的设备中。当你想将你的应用数据与其它的应用共享时,内容提供器就可以发挥作用了。因为内容提供器类实现了一组标准的方法,从而能够让其它的应用保存或读取此内容提供器处理的各种数据类型。数据是应用的核心。在Android 中,默认使用鼎鼎大名的SQLite 作为系统DB。但是在Android 中,使用方法有点小小的不一样。在Android 中每一个应用都运行在各自的进程中,当你的应用需要访问其他应用的数据时,也就需要数据在不同的虚拟机之间传递,这样的情况操作起来可能有些困难(正常情况下,你不能读取其他的应用的db 文件),ContentProvider 正是用来解决在不同的应用包之间共享数据的工具。

1、所有被一个Android 应用程序创建的偏好设置,文件和数据库都是私有的。

6.android中线程与线程,进程与进程之间如何通信

1、一个 Android 程序开始运行时,会单独启动一个Process。

默认情况下,所有这个程序中的Activity或者Service都会跑在这个Process。

默认情况下,一个Android程序也只有一个Process,但一个Process下却可以有许多个

Thread。

2、一个 Android 程序开始运行时,就有一个主线程Main Thread被创建。该线程主要负责UI界面的显示、更新和控件交互,所以又叫UI Thread。

一个Android程序创建之初,一个Process呈现的是单线程模型--即Main Thread,所有的任务都在一个线程中运行。所以,Main Thread所调用的每一个函数,其耗时应该越短越好。而对于比较费时的工作,应该设法交给子线程去做,以避免阻塞主线程(主线程被阻塞,会导致程序假死现象)。

3、Android单线程模型:Android UI操作并不是线程安全的并且这些操作必须在UI线程中执行。如果在子线程中直接修改UI,会导致异常。

Android中Handler、Thread(HanlderThread)、Runnable之间的关系

首先说明Android的CPU分配的最小单元是线程,Handler一般是在某个线程里创建的,因而Handler和Thread就是相互绑定的,一一对应。而Runnable是一个接口,Thread是Runnable的子类。所以说,他俩都算一个进程。HandlerThread顾名思义就是可以处理消息循环的线程,他是一个拥有Looper的线程,可以处理消息循环。与其说Handler和一个线程绑定,不如说Handler是和Looper一一对应的。最后需要说明的是,在UI线程(主线程)中: mHandler=new Handler();mHandler.post(new Runnable(){ void run(){ //执行代码...} });这个线程其实是在UI线程之内运行的,并没有新建线程。

常见的新建线程的方法是: Thread thread = new Thread();thread.start();HandlerThread thread = new HandlerThread(“string”);thread.start();

7.widget相对位置的完成在antivity的哪个生命周期阶段实现

onStart

8.说说mvc模式的原理,它在android中的运用 : MVC(Model_view_contraller)”模型_视图_控制器”。MVC 应用程序总是由这三个部分组成。Event(事件)导致 Controller改变 Model 或View,或者同时改变两者。只要 Controller改变了 Models 的数据或者属性,所有依赖的 View 都会自动更新。类似的,只要 Controller改变了 View,View会从潜在的 Model 中获取数据来刷新自己。

9.说说在android中有哪几种数据存储方式

在Android中,可供选择的存储方式有SharedPreferences、文件存储、SQLite数据库方式、内容提供器(Content provider)和网络

10.android中有哪几种解析xml的类,官方推荐哪种?以及它们的原理和区别

DOM、SAX(Simple API for XML)、XmlPullParser

11.listview你是怎么优化的。

Adapter的作用就是ListView界面与数据之间的桥梁,当列表里的每一项显示到页面时,都会调用Adapter的getView方法返回一个View。想过没有? 在我们的列表有1000000项时会是什么样的?是不是会占用极大的系统资源?

先看看下面的代码:

public View getView(int position, View convertView, ViewGroup parent){

View item = mInflater.inflate(R.layout.list_item_icon_text, null);

((TextView)item.findViewById(R.id.text)).setText(DATA[position]);

((ImageView)item.findViewById(R.id.icon)).setImageBitmap((position & 1)== 1 ? mIcon1 : mIcon2);

return item;

}

怎么样?如果超过1000000项时,后果不堪设想!您可千万别这么写!

我们再来看看下面的代码:

public View getView(int position, View convertView, ViewGroup parent){

if(convertView == null){

convertView = mInflater.inflate(R.layout.item, null);

}

((TextView)convertView.findViewById(R.id.text)).setText(DATA[position]);

((ImageView)convertView.findViewById(R.id.icon)).setImageBitmap((position & 1)== 1 ? mIcon1 : mIcon2);

return convertView;

}

怎么样,上面的代码是不是好了很多?系统将会减少创建很多View。性能得到了很大的提升。

还有没有优化的方法呢? 答案是肯定的:

public View getView(int position, View convertView, ViewGroup parent){

ViewHolder holder;

if(convertView == null){

convertView = mInflater.inflate(R.layout.list_item_icon_text, null);

holder = new ViewHolder();

holder.text =(TextView)convertView.findViewById(R.id.text);

holder.icon =(ImageView)convertView.findViewById(R.id.icon);

convertView.setTag(holder);

} else {

holder =(ViewHolder)convertView.getTag();

}

holder.text.setText(DATA[position]);

holder.icon.setImageBitmap((position & 1)== 1 ? mIcon1 : mIcon2);

return convertView;

}

static class ViewHolder {

TextView text;

ImageView icon;

}

怎么样?会不会又给您的系统带来很大的提升呢?看看下面三种方式的性能对比图您就知道了!

12.view的刷新

Android中对View的更新有很多种方式,使用时要区分不同的应用场合。我感觉最要紧的是分清:多线程和双缓冲的使用情况。

1.不使用多线程和双缓冲

这种情况最简单了,一般只是希望在View发生改变时对UI进行重绘。你只需在Activity中显式地调用View对象中的invalidate()方法即可。系统会自动调用 View的onDraw()方法。

2.使用多线程和不使用双缓冲

这种情况需要开启新的线程,新开的线程就不好访问View对象了。强行访问的话会报:android.view.ViewRoot$CalledFromWrongThreadException:Only the original thread that created a view hierarchy can touch its views.这时候你需要创建一个继承了android.os.Handler的子类,并重写handleMessage(Message msg)方法。android.os.Handler是能发送和处理消息的,你需要在Activity中发出更新UI的消息,然后再你的Handler(可以使用匿名内部类)中处理消息(因为匿名内部类可以访问父类变量,你可以直接调用View对象中的invalidate()方法)。也就是说:在新线程创建并

发送一个Message,然后再主线程中捕获、处理该消息。

3.使用多线程和双缓冲

Android中SurfaceView是View的子类,她同时也实现了双缓冲。你可以定义一个她的子类并实现SurfaceHolder.Callback接口。由于实现SurfaceHolder.Callback接口,新线程就不需要android.os.Handler帮忙了。SurfaceHolder中lockCanvas()方法可以锁定画布,绘制玩新的图像后调用unlockCanvasAndPost(canvas)解锁(显示),还是比较方便得。

13.IPC及原理

什么是Android操作系统,所谓的Android:是基于Linux内核的软件平台和操作系统,早期由Google开发,后由开放手机联盟Open Handset Alliance)开发。

Linux系统中进程间通信的方式有:socket, named pipe,message queque, signal,share memory。Java系统中的进程间通信方式有socket, named pipe等。android应用程序理所当然可以应用JAVA的IPC

机制实现进程间的通信,取而代之的是Binder通信。Google为什么要采用这种方式呢,这取决于Binder通信方式的高效率。Binder通信是通过linux的binder driver来实现的。Binder通信操作类似线程迁移(thread migration),两个进程间IPC看起来就象是一个进程进入另一个进程执行代码然后带着执行的结果返回。Binder的用户空间为每一个进程维护着一个可用的线程池,线程池用于处理到来的IPC以及执行进程本地消息,Binder通信是同步而不是异步。Android中的Binder通信是基于Service与Client的,所有需要IBinder通信的进程都必须创建一个IBinder接口。

系统中有一个进程管理所有的system service,Android虚拟机不允许用户添加非授权的System service,当然现在源码开发了,我们可以修改一些代码来实现添加底层system Service的目的。

对用户程序来说,我们也要创建server,或者Service用于进程间通信,这里有一ActivityManagerService管理JAVA应用层所有的service创建与连接(connect)。disconnect,所有的 Activity也是通过这个service来启动,加载的。ActivityManagerService也是加载在Systems Servcie中的。

Android虚拟机启动之前系统会先启动service Manager进程,service Manager打开binder驱动,并通知binder kernel驱动程序这个进程将作为System Service Manager。然后该进程将进入一个循环,等待处理来自其他进程的数据。用户创建一个System service后,通过defaultServiceManager得到一个

远程ServiceManager的接口。

通过这个接口我们可以调用 addService函数将System service添加到Service Manager进程中,然后client可以通过getService获取到需要连接的目的Service的IBinder对象。这个IBinder是 Service的BBinder在binder kernel的一个参考,所以service IBinder 在binder kernel中不会存在相同的两个

IBinder对象。

每一个Client进程同样需要打开Binder驱动程序。对用户程序而言,我们获得这个对象就可以通过binder kernel访问service对象中的方法。Client与Service在不同的进程中,通过这种方式实现了类似线程间的迁移的通信方式,对用户程序而言当调用Service返回的IBinder接口后,访问Service中的方法就

如同调用自己的函数。实现接口时有几个原则:

抛出的异常不要返回给调用者.跨进程抛异常处理是不可取的。IPC调用是同步的。如果你知道一个IPC服务需要超过几毫秒的时间才能完成地话,你应该避免在Activity的主线程中调用。

也就是IPC调用会挂起应用程序导致界面失去响应.这种情况应该考虑单起一个线程来处理,能在AIDL接口中声明静态属性。IPC的调用步骤:

1.声明一个接口类型的变量,该接口类型在.aidl文件中定义。

2.实现ServiceConnection。

3.调用ApplicationContext.bindService(),并在ServiceConnection实现中进行传递.4.在ServiceConnection.onServiceConnected()实现中,你会接收一个IBinder实例(被调用的Service).调用 YourInterfaceName.Stub.asInterface((IBinder)service)将参数转换YourInterface类型。

5.调用接口中定义的方法。你总要检测到DeadObjectException异常,该异常在连接断开时被抛

出。它只会被远程方法抛出。

6.断开连接,调用接口实例中的ApplicationContext.unbindService()

14.Android多线程

在Android下面也有多线程的概念,在C/C++中,子线程可以是一个函数,一般都是一个带有循环的函数,来处理某些数据,优先线程只是一个复杂的运算过程,所以可能不需要while循环,运算完成,函数结束,线程就销毁。对于那些需要控制的线程,一般我们都是和互斥锁相互关联,从而来控制线程的进度,一般我们创建子线程,一种线程是很常见的,那就是带有消息循环的线程。

消息循环是一个很有用的线程方式,曾经自己用C在Linux下面实现一个消息循环的机制,往消息队列里添加数据,然后异步的等待消息的返回。当消息队列为空的时候就会挂起线程,等待新的消息的加入。这是一个很通用的机制。在Android,这里的线程分为有消息循环的线程和没有消息循环的线程,有消息循环的线程一般都会有一个Looper,这个事android的新概念。我们的主线程(UI线程)就是一个消息循环的线程。针对这种消息循环的机制,我们引入一个新的机制Handle,我们有消息循环,就要往消息循环里面发送相应的消息,自定义消息一般都会有自己对应的处理,消息的发送和清除,消息的的处理,把这些都封装在Handle里面,注意Handle只是针对那些有Looper的线程,不管是UI线程还是子线程,只要你有Looper,我就可以往你的消息队列里面添加东西,并做相应的处理。

但是这里还有一点,就是只要是关于UI相关的东西,就不能放在子线程中,因为子线程是不能操作UI的,只能进行数据、系统等其他非UI的操作。

15.Android为什么要设计4大组件,他们之间的联系,不设计行不行(主要是为了实现MVC模式,然而java中最难的模式也是这个,很少有产品能将这个模式做得很好【Technicolor 的面试官问的这个】

16,service的周期,activity的周期,谈下你对Android内部应用的了解,比如他做电话,以及联系人等等应用。框架层有很多东西还是多看看,熟悉Android怎么做的,不管你做应用程开发还是应用框架层开发很有好处的。在就是你项目经验,突出你遇到什么难点,然后是怎么解决的!尽量将每个技术点凸显出来,当然面试官有时候会为了体现你是否真正做过,他会问你,你在这个应用中做那个模块,用了多少个类之类的问题。偶尔有的面试官会问你,你用过Android自带的单元测试了没,怎么用的?当然我面试过很多家单位,有 的是做平板,手机,数字电视,有的是做出个erp之类的客户端等等,出于前面的三个,基本上都是将Android的全部改掉,如果真正要做Android的话,大家要学的还很多。总之,一句话,什么样的面试官都有,去面试的时候要做好一切心理准备,不管是技术还是基础都得扎实。一个人的交谈能力也很重要,总之不是非常标准的普通话,最起码你说的得让别人听得懂,而且得把面试官讲得非常彻底,这样你获得offer的机会更大,谈工资也有优势~~当然曾经一家公司的面试官跟我说过,技术是不惜钱的,只要你有能力,多少钱他都请。_ 确实,来北京求职期间,牛人真的很多,而且有的面试官也非常好,给了很多忠肯的意见。并不是每个面试官都特想为难你的~最主要的还是想知道你的技术,因为他们也是吃公司饭,得为这个负责。

Basic:

1.基本的UI控件和布局文件

2.UI配套的Adapter的使用

3.Activity, Intent,Service,broadCast Receiver他们的生命周期管理熟悉一下

4.操作手机上的数据库SQLite应用

17.为什么看好 Android

对于开发人员来讲:上手容易,入门简单,api齐全,适应性强 对于用户来讲:软件丰富,系统稳定,功能齐全 对于开发商来讲:可定制性高,开发成本低,免费。

18.现在在公司做哪些工作(关于 Android)错

手机软件开发一般是分平台的,目前比较火的是iPhone和Android手机平台上的软件开发。

一般大学计算机毕业,都会学过相应的编程语言,比如C或C++,有这两种语言做为基础,相信你可以快速去掌握其他的编程语言。

如果你想从事iPhone平台上的开发就要去学习Obj-C语言,想从事Android平台上的就学习Java语言,除了掌握语言以后,还有的就是不同平台上的开发工具。

如果你想从事手机软件开发方面的工作的话,我建议你可以选择一家专业的移动互联网开发培训学校,参加专业的培训能帮助你更系统更扎实的掌握目前最先进的技术

19.Android 的框架以及一些基础知识

20.Android 一些方面的领悟(如Android框架的 IoC特性,View System 的状态机机制等)

21.对多线程的运用和理解,及多线程之间handle的传值。

22.对android 虚拟机的理解,包括内存管理机制垃圾回收机制。

23.framework工作方式及原理,Activity是如何生成一个view的,机制是什么。

24.android本身的一些限制,不如apk包大小限制,读取大文件时的时间限制。

25.Linux中跨进程通信的集中方式

1.socket;

2.name pipe命名管道; 3.message queue消息队列; 4.singal信号量;

5.share memory共享内存;

26.dvm的进程和Linux的进程, 应用程序的进程是否为同一个概念

DVM指dalivk的虚拟机。每一个Android应用程序都在它自己的进程中运行,都拥有一个独立的Dalvik虚拟机实例。而每一个DVM都是在Linux 中的一个进程,所以说可以认为是同一个概念。

27.sim卡的EF 文件有何作用

sim卡的文件系统有自己规范,主要是为了和手机通讯,sim本 身可以有自己的操作系统,EF就是作存储并和手机通讯用的

28.AT命令的User case的概念

1、Use Case的作用:

我个人认为Use Case仅仅用来反映用户需求,并且在对象分析过程中,能够起到一个查漏补缺的作用。但是使用“先确定Use Case,再指认对象”实在是一种愚蠢的方法(恕我直言)。我个人认为,指认对象使用Yourdon在《Objuect Oriented Analysis》中提到的使用CheckList的方法在实践中是比较实用的。我近来读到的几本书,也印证了我的想法。就我我个人在实践中的经验,使用“首先确定Use Case”策略,非常容易导致分析员滑入“功能分解”的泥沼。而且从Use Case来导出对象将导致拙劣的分析模型。

2、Use Case之间的关系:

UML 1.3中,Use Case之间的关系只有3种,Generalization,Include和Extend,国内出版的关于UML的中文书有两本,一本是《UML从入门到精通》(其实应该叫做Rose入门),一本是北航的《面向对象的可视化建模技术》,后一本书在这个方面起到了很坏的作用(前一本书我没有怎么看,大概也好不到哪里去),一是使用了比较老的UML标准,比如使用了Use关系,而且对于Extend和Generalization关系的描述也很混乱,很多人受到了误导(尤其是Extend关系)。我建议有条件的网友尽量去看英文原版的著作,比如“UML三剑客”的《Unified Modeling Language User Guide》或者直接去读UML1.3的规范。(而且Use Case之间的关系是用虚线+箭头表示的,直到Rose 2000对此都没有支持)

3、Actor和Use Case之间的关系:

在UML 1.3之中,Actor和Use Case之间的关系应该是没有箭头的。虽然规范中并没有明确禁止使用箭头,但是从字句中隐含的意义来看,应该是没有箭头的,而且规范中给出的示例是没有箭头的。我认识的很多人,想当然的认为Actor和Use Case之间的关系上的箭头标示信息流向或者主/被动关系,其实这个关系仅仅表示某个Actor参与了某个Use Case。

29﹑Android 手机操作系统的四层架构?

架构框架以此从上到下:

1.Applications

(应用程序(应用层));

Android 会同一系列核心应用程序包一起发布,该应用程序包包括 email 客户端,SMS 短消息程序,日历,地图,浏览器,联系人管理程序等。所有的应用程序都是使用 JAVA 语 言编写的。

2.Application FrameWork

(应用程序扩展层(框架));

由于 Android 的手机操作系统是,基于 Liunx 2.6 系统之上封装而成。所以开发人员可也以直接访问核心程序所使用的API框架,该核心应用程序的API框架设计简化了组件的重用,任何一个核心应用程序(模块)都暴露出它的功能作用,并且其他应用程序也都可以使用该核心应用程序(模块)的功能(不过的遵守该核心应用程序框架的安全性限制)。同样,该应用程序的重用机制也使用户方便使用应程序的相关组件。API 框架隐藏的核心应用程序是一系列的应用程序的服务和系统应用,其中包括如下:

(Android 手机中的 View 是最基本的一个 UI 类)丰富而又可扩展的视图(手机界面所显示的组件(Activity上所显示的))组件,可以用来构建应用程序

如:(视图)Views, 网格(grids), 文本框(text boxes), 按钮(button), 放置图片区(imageview),文本编辑区

(edittext), 文本显示区(textview),3.Android RunTime Libraries

(Android 系统运行库);

4.Liunx Kernel

(Android 系统最底层核心系统 Liunx)

Android 的核心系统服务依赖于 Liunx 2.6 内核,如系统安全,内存管理,进程管理,网络协议栈和驱动模型。Liunx 内核也同时作为硬件和软件栈之间的抽象层。

30、Android dvm的进程和 Linux 的进程, 应用程序的进程是否为同一个概念

DVM 指 dalivk 的虚拟机。每一个 Android 应用程序都在它自己的进程中运行,都拥有一个独立的 Dalvik 虚拟机实例。而每一个 DVM 都是在 Linux 中的一个进程,所以说可以认为是同一个概念。

31、sim卡的 EF 文件有何作用

sim 卡的文件系统有自己规范,主要是为了和手机通讯,sim 本身可以有自己的操作 系统,EF就是作存储并和手机通讯用的

32、嵌入式操作系统内存管理有哪几种,各有何特性

页式,段式,段页,用到了 MMU,虚拟空间等技术

33.什么是嵌入式实时操作系统, Android 操作系统属于实时操作系统吗?

嵌入式实时操作系统是指当外界事件或数据产生时,能够接受并以足够快的速度予以 处理,其处理的结果又能在规定的时间之内来控制生产过程或对处理系统作出快速响应,并 控制所有实时任务协调一致运行的嵌入式操作系统。主要用于工业控制、军事设备、航空航天等领域对系统的响应时间有苛刻的要求,这就需要使用实时系统。又可分为软实时和硬实时两种,而 android 是基于 linux 内核的,因此属于软实时。

34、一条最长的短信息约占多少 byte?

中文 70(包括标点),英文 160,160 个字节

1.2.3.4.5.6.7.8.9.10.11.12.13.14.什么是Activity?

请描述一下Activity生命周期。

两个Activity之间跳转时必然会执行的是哪几个方法。

横竖屏切换时候Activity的生命周期。

如何将一个Activity设置成窗口的样式。

你后台的Activity被系统 回收怎么办?

如何退出Activity?如何安全退出已调用多个Activity的Application?

如果后台的Activity由于某原因被系统回收了,如何在被系统回收之前保存当前状态?

两个Activity之间怎么传递数据?

怎么让在启动一个Activity是就启动一个service?

同一个程序,但不同的Activity是否可以放在不同的Task任务栈中?

Activity怎么和service绑定,怎么在activity中启动自己对应的service? 什么是Service以及描述下它的生命周期。

Service有哪些启动方法,有什么区别,怎样停用Service?

15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.32.33.34.35.36.37.38.39.40.41.42.43.44.45.46.47.48.49.50.51.52.53.54.55.56.57.58.不用service,B页面为音乐播放,从A跳转到B,再返回,如何使音乐继续播放?

什么是IntentService?有何优点? 什么时候使用Service?

请描述一下Intent 和 Intent Filter。Intent传递数据时,可以传递哪些类型数据? 说说Activity,Intent,Service是什么关系。请描述一下Broadcast Receiver。

在manifest和代码中如何注册和使 用 broadcast receiver。请介绍下ContentProvider是如何实现数据共享的。请介绍下Android的数据存储方式。

为什么要用ContentProvider?它和sql的实现上有什么差别? 请介绍下Android中常用的五种布局。

谈谈UI中,Padding和Margin有什么区别?

widget相对位置的完成在antivity的哪个生命周期阶段实现。

请解释下在单线程模型中Message、Handler、Message Queue、Looper之间的关系。AIDL的全称是什么?如何工作?能处理哪些类型的数据?

请解释下Android程序运行时权限与文件系统权限的区别。

系统上安装了多种浏览器,能否指定某浏览器访问指定页面?

对多线程的运用和理解,及多线程之间handle的传值。对android虚拟机的理解,包括内存管理机制垃圾回收机制。

Framework工作方式及原理,Activity是如何生成一个view的,机制是什么。android本身的一些限制,比如apk包大小限制,读取大文件时的时间限。如何加载的音乐信息,如何改善其效率。

ListView如何提高其效率?

启动应用后,改变系统语言,应用的语言会改变么?

启动一个程序,可以主界面点击图标进入,也可以从一个程序中跳转过去,二者有什么区别?

Android程序与Java程序的区别?

Android中Task任务栈的分配。

在Android中,怎么节省内存的使用,怎么主动回收内存?

不同工程中的方法是否可以相互调用?

在Android中是如何实现判断区分通话记录中的电话状态,去电,来电、未接来电?

dvm的进程和Linux的进程, 应用程序的进程是否为同一个概念

sim卡的EF 文件有何作用

如何判断是否有SD卡?

嵌入式操作系统内存管理有哪几种,各有何特性。

什么是嵌入式实时操作系统, Android 操作系统属于实时操作系统吗? 一条最长的短信息约占多少byte? Linux中跨进程通信的几种方式。谈谈对Android NDK的理解。

谈谈Android的优点和不足之处。

Android系统中GC什么情况下会出现内存泄露呢? Android UI中的View如何刷新。简单描述下Android 数字签名。什么是ANR 如何避免它?

59.60.61.62.63.64.65.66.android中的动画有哪几类,它们的特点和区别是什么?

handler机制的原理。

android中线程与线程,进程与进程之间如何通信。

说说mvc模式的原理,它在android中的运用。

android中有哪几种解析xml的类,官方推荐哪种?以及它们的原理和区别。

7.android实验报告 篇七

实验名称

音乐播放器

指导教师

实验成绩

2016 年04月

一、实验目的

本项目是一款基于Android手机平台的音乐播放器,使Android手机拥有个性的多媒体播放器,使手机显得更生动灵活化,与人们更为接近,让手机主人随时随地处于音乐视频的旋律之中。使人们的生活更加多样化。也使设计者更加熟练Android的技术和其它在市场上的特点。

二、实验内容及要求

在其中写清楚这个实验具体要你做什么,怎么做,要达到什么样的效果等。本设计实现的主要功能是播放Mp3,Wav多种格式的音乐文件,并且能够控制播放,暂停,停止,下一首,上一首播放列等基本播放控制功能,界面简明,操作简单。

三、实验方案设计

在其中写清楚你的程序的详细设计,用流程图配文字的形式描述。如果其中涉及到算法,一定要把算法阐述清楚。

3.1.1假设安装了音乐播放器的用户是系统的主要设计对象,其拥有以下操作,启动软件、播放音乐、暂停播放、停止播放、退出软件,其用例图如下

图2.1 播放器基本用例图

3.1.2用例分析 用例名称:启动软件 参与者:用户

目标:使得用户启动软件并加载手机和sd卡上的音频文件到播放列表 前置条件:无

基本事件流:1.用户启动软件

2.播放器将播放列表中的当前的歌曲

用例名称:播放 参与者:用户

目标:使得用户可以播放在播放列表中选中的歌曲 前置条件:播放器正在运行

基本事件流:1.用户单击“播放”按钮

2.播放器将播放列表中的当前的歌曲

用例名称:暂停 参与者:用户

目标:使得用户可以暂停正在播放的歌曲 前置条件:歌曲正在播放且未停止和暂停 基本事件流:1.用户单击“暂停”按钮

2.播放器将暂停当前的歌曲

④用例名称:停止 参与者:用户

目标:使得用户可以停止正在播放的歌曲 前置条件:歌曲正在播放或暂停 基本事件流:1.用户单击“停止”按钮

2.播放器将停止当前播放的歌曲

⑤用例名称:推出 参与者:用户

目标:使得用户退出或者后台播放音乐 前置条件:程序在运行

基本事件流:1.用户按返回键

2.播放器退出或者进入后台播放

四、实验测试

Step1.启动软件后,软件自动检索手机和sd卡的音频文件,并组织显示成列表.Step2.点击列表的歌曲名字。

Step3.播放音乐。

Step4.点击暂停,音乐暂停

Step5.点击播放 转到step3 Step6.点击停止 停止播放音乐

Step7.点击退出,若音乐处于播放状态,则音乐转向后台播放,界面退出。

Step8.点击退户,若音乐处于暂停或者停止状态,直接退出。

音乐播放器流程图

4.1MusicInfoController类

这个类继承于service,是播放音乐的服务类。播放音乐,暂停音乐,停止播放等操作都封装在这个类中。

主要的执行动作有:

4.1.1.类启动 onCreate(){

mMediaPlayer = new MediaPlayer();//分配一个播放对象

mMediaPlayer.setOnPreparedListener(mPrepareListener);//绑定之前

mMediaPlayer.setOnCompletionListener(mCompleteListener);//绑定之 后

}

4.1.2.服务绑定activity

MediaPlayer.OnCompletionListener mCompleteListener = new

MediaPlayer.OnCompletionListener()//实例化一个绑定监听器的匿名类

{

public void onCompletion(MediaPlayer mp)//完成绑定后

{

broadcastEvent(PLAY_COMPLETED);//广播消息

}

};

4.2MusicInfoController类

这个类主要用于获取android系统中的音频文件,并提供访问接口,它是一个单例类。

4.2.1获得播放文件列表

private Cursor query(Uri uri, String[] prjs, String selections, String[] selectArgs, String order){ ContentResolver resolver = pApp.getContentResolver();//取得一个连接对象if(resolver == null){

return null;

}

return resolver.query(uri, prjs, selections, selectArgs, order);} public Cursor getAllSongs(){

return query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, null, null, null, MediaStore.Audio.Media.DEFAULT_SORT_ORDER);//查询ContentResolver 的所有音频文件

} 4.3MusicList类

改类继承于ListActivity,主要用于显示歌曲列表,并且封装部分操作,以及与父级目标通信。

4.3.1播放

protected void onListItemClick(ListView l, View v, int position, long id){ //歌曲列表的某项被点击

super.onListItemClick(l, v, position, id);

if(mCursor == null ||mCursor.getCount()== 0){

return;

}

mCursor.moveToPosition(position);//游标移动到当前路径

String url = mCursor.getString(mCursor

.getColumnIndexOrThrow(MediaStore.Audio.Media.DATA));//取得绝对路径

mMusicPlayerService.setDataSource(url);//传递绝对路径

mMusicPlayerService.start();//播放音乐

}

4.3.2暂停/播放

mPlayPauseButton.setOnClickListener(new Button.OnClickListener(){

public void onClick(View v){

if(mMusicPlayerService!= null &&

mMusicPlayerService.isPlaying()){

mMusicPlayerService.pause();//音乐播放的服务暂停

mPlayPauseButton.setText(R.string.play);//改变按钮文字

} else if(mMusicPlayerService!= null){

mMusicPlayerService.start();//如果已经是暂停,则播放音乐

mPlayPauseButton.setText(R.string.pause);//改变文字

}

}

});

4.3.3停止

mStopButton.setOnClickListener(new Button.OnClickListener(){

public void onClick(View v){

// Perform action on click

if(mMusicPlayerService!= null){

mTextView.setVisibility(View.VISIBLE);//改变文字状态

mPlayPauseButton.setVisibility(View.INVISIBLE);//隐藏按钮

mStopButton.setVisibility(View.INVISIBLE);//隐藏停止按钮

mMusicPlayerService.stop();//后台音乐停止播放

}

}

});4.4MusicPlayerApp类

该类继承与Application,是程序的生存类。可以标识音乐播放器的生命周期,包括音乐在后台播放等。

4.4.1单例模式

public void onCreate(){

super.onCreate();

mMusicInfoController = MusicInfoController.getInstance(this);//返回该类的一个唯一实例

}

public MusicInfoController getMusicInfoController(){

return mMusicInfoController;}

五、程序的使用手册

系统编译生成apk文件,将apk文件拷到手机或者sd卡中,直接打开即可安装,或者安装360手机助手通过usb调试的方式进行安装。

启动软件后,加载歌曲列表现在这个界面上,如01表示歌曲名,unknown表示歌曲的演唱者

软件启动界面

从加载的歌曲列表中点击要播放的歌曲,开始播放

音乐播放界面

六、心得体会

上一篇:2015-2016年中学校本培训总结下一篇:那一刻,我感动了作文600字