1. activity的生命周期
函数调用过程:
启动第一个Activity的时候:
第一次创建onCreate()-->Activity可见了onStart()-->Activity可以操作了onResume()。
点击第一个Activity上的按钮通过Intent跳到第二个Activity:
第一个Activity暂停onPause()-->创建第二个ActivityonCreate()-->Activity可见onStart()-->Activity可操作onResume()-->第一个Activity被第二个Activity完全遮盖onStop()(如果调用了finish(),或者系统资源紧缺,则会被销毁onDestory())。
点击系统返回功能建,从第二个Activity回到第一个Activity :
第二个Activity暂停onPause()-->第一个Activity重启动OnRestart()(并没有被销毁,如果销毁了则要创建onCreate())-->第一个Activity可见onStart()-->第一个Activity可操作onResume()-->第二个Activity被完全遮盖onStop()(如果调用了finish(),或者系统资源紧缺,则会被销毁onDestory())。
2. android 动画分类
tweened animation(补间动画) 和 frame-by-frame animation(帧动画),一般我们用的是第一种。补间动画又分为AlphaAnimation,透明度转换 RotateAnimation,旋转转换 ScaleAnimation,缩放转换 TranslateAnimation位置转换(移动)。
3. Message Queue(消息队列):用来存放通过Handler发布的消息,通常附属于某一个创建它的线程,可以通过Looper.myQueue()得到当前线程的消息队列;线程:UI thread 通常就是main thread,而Android启动程序时会替它建立一个Message Queue;andriod提供了 Handler 和 Looper 来满足线程间的通信;Looper: 一个线程可以产生一个Looper对象,由它来管理此线程里的Message Queue(消息队列);Handler 先进先出原则,可以构造Handler对象来与Looper沟通,以便push新消息到Message Queue里;或者接收Looper从Message Queue取出)所送来的消息。
andler获取当前线程中的looper对象,looper用来从存放Message的MessageQueue中取出Message,再有Handler进行Message的分发和处理.
Looper也把消息队列里的消息广播给所有的Handler:Handler接受到消息后调用handleMessage进行处理,
判断Handler对象里面的Looper对象是属于哪条线程的,则由该线程来执行!
1. 当Handler对象的构造函数的参数为空,则为当前所在线程的Looper;
2.Looper.getMainLooper()得到的是主线程的Looper对象,Looper.myLooper()得到的是当前线程的Looper对象。
4. 默认情况下,一个Android程序也只有一个Process,但一个Process下却可以有许多个Thread;所有这个程序中的Activity、Service都会跑在这个Proces;一个 Android 程序开始运行时,就有一个主线程Main Thread被创建。该线程主要负责UI界面的显示、更新和控件交互,所以又叫UI Thread;一个Android程序创建之初,一个Process呈现的是单线程模型--即Main Thread,所有的任务都在一个线程中运行。所以,Main Thread所调用的每一个函数,其耗时应该越短越好。而对于比较费时的工作,应该设法交给子线程去做,以避免阻塞主线程(主线程被阻塞,会导致程序假死 现象);Android单线程模型:Android UI操作并不是线程安全的并且这些操作必须在UI线程中执行。如果在子线程中直接修改UI,会导致异常。
5. sim卡的文件系统有自己规范,主要是为了和手机通讯,sim本身可以有自己的操作系统,sim卡的EF文件就是作存储并和手机通讯用的。
6. 如何将sqlite数据库文件a.db与apk一起发布?可以将a.db文件复制到Eclipse Android工程中的res raw目录,在res raw目录中的文件不会被压缩,这样可以直接提取该目录中的文件;Android中不能直接打开resraw目录中的数据库文件,而需要在程序第一次启动时将该文件复制到手机内存或SD卡的某个目录中,然后再打开该数据库文件。复制的基本方法是使用getResources().openRawResource方法获得res raw目录中资源的 InputStream对象,然后将该InputStream对象中的数据写入其他的目录中相应文件中。在Android SDK中可以使用SQLiteDatabase.openOrCreateDatabase方法来打开任意目录中的SQLite数据库文件。
7. Android 中MVC 的具体体现:视图层(view):一般采用xml文件进行界面的描述,也可以使用javascript+html等的方式作为view层,当然需要进行java和javascript之间的通信。模型层(model):对数据库的操作、对网络等的操作都应该在model里面处理,当然对业务计算等操作也是必须放在的该层的;控制层(controller):android的控制层的重任通常落在了众多的acitvity的肩上,这句话也就暗含了不要在acitivity中写业务代码,要通过activity交给model层做业务逻辑的处理, android中的acitivity的响应时间是5s,如果耗时的操作放在这里,程序就很容易被回收掉。第一步:继承Service类public class SMSService extends Service {},第二步:在AndroidManifest.xml文件中的<application>节点里对服务进行配置:,<service android:name=".SMSService" />;Context.startService()或Context.bindService()方法启动服务。,调用者与服务之间没有关连,即使调用者退出了,服务仍然运行。使用bindService()方法启用服务,调用者与服务绑定在了一起。Context.startService()系统会先调用服务的onCreate()方法,接着调用onStart()方法。如果调用startService()方法前服务已经被创建,多次调用startService()方法并不会导致多次创建服务,但会导致多次调用onStart()方法,采用startService()方法启动的服务,只能调用Context.stopService()方法结束服务,服务结束时会调用onDestroy()方法。onCreate() 该方法在服务被创建时调用,该方法只会被调用一次,无论调用多少次startService()或bindService()方法,服务也只被创建一次。onDestroy()该方法在服务被终止时调用。onStart() 只有采用Context.startService()方法启动服务时才会回调该方法。该方法在服务开始运行时被调用。多次调用startService()方法尽管不会多次创建服务,但onStart() 方法会被多次调用。onBind()只有采用Context.bindService()方法启动服务时才会回调该方法。该方法在调用者与服务绑定时被调用,当调用者与服务已经绑定,多次调用Context.bindService()方法并不会导致该方法onBind()被多次调用。
采用Context. bindService()方法启动服务的代码如下: public class HelloActivity extends Activity {
ServiceConnection conn = new ServiceConnection() {
public void onServiceConnected(ComponentName name, IBinder service) {
}
public void onServiceDisconnected(ComponentName name) {
}
};
@Override
public void onCreate(Bundle savedInstanceState) {
Button button =(Button) this.findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener(){
public void onClick(View v) {
Intent intent = new Intent(HelloActivity.this, SMSService.class);
bindService(intent, conn, Context.BIND_AUTO_CREATE);
//unbindService(conn);//解除绑定
}});
}
}
8. px:表示屏幕实际的象素, in:表示英寸,是屏幕的物理尺寸, dp 是与密度无关,sp 除了与密度无关外,还与scale 无关,使用dp 和sp,系统会根据屏幕密度的变化自动进行转换..
9. standard: 标准模式,一调用startActivity()方法就会产生一个新的实例; singleTop: 如果已经有一个实例位于Activity栈的顶部时,就不产生新的实例,而只是调用Activity中的newInstance()方法。如果不位于栈顶,会产生一个新的实例。singleTask: 会在一个新的task中产生这个实例,以后每次调用都会使用这个,不会去产生新的实例了。singleInstance: 这个跟singleTask基本上是一样,只有一个区别:在这个模式下的Activity实例所处的task中,只能有这个activity实例,不能有其他的实例。
10. android intent: Android应用中,主要是由一些组件组成,(Activity,Service,ContentProvider,etc.)在这些组件之间的通讯中,由Intent协助完成.
Intent负责对应用中一次操作的动作、动作涉及数据、附加数据进行描述,Android则根据此Intent的描述,负责找到对应的组件,将 Intent传递给调用的组件,并完成组件的调用。Intent在这里起着实现调用者与被调用者之间的解耦作用。
显示匹配(Explicit):
1. public TestB extents Activity
2. {
3. .........
4. };
5. public class Test extends Activity
6. {
7. ......
8. public void switchActivity()
9. {
10. Intent i = new Intent(Test.this, TestB.class);
11. this.startActivity(i);
12. }
13. }
代码简洁明了,执行了switchActivity()函数,就会马上跳转到名为TestB的Activity中。
隐式匹配(Implicit):
首先要匹配Intent的几项值:Action, Category, Data/Type,Component
如果填写了Componet就是上例中的Test.class)这就形成了显示匹配。匹配规则为最大匹配规则.
11. 当你的程序中某一个Activity A 在运行时中,主动或被动地运行另一个新的Activity B,
这个时候A会执行public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putLong("id", 1234567890);}
B 完成以后又会来找A, 这个时候就有两种情况,一种是A被回收,一种是没有被回收,被回
收的A就要重新调用onCreate()方法,不同于直接启动的是这回onCreate()里是带上参数savedInstanceState,没被收回的就还是onResume。
savedInstanceState是一个Bundle对象,你基本上可以把他理解为系统帮你维护的一个Map对象。在onCreate()里你可能会 用到它,如果正常启动onCreate就不会有它,所以用的时候要判断一下是否为空。
if(savedInstanceState != null){
long id = savedInstanceState.getLong("id");
}
12. 对于单一Activity的应用来说,退出很简单,直接finish()即可。当然,也可以用killProcess()和System.exit()这样的方法。为了编程方便,最好定义一个Activity基类,处理这些共通问题:关闭多个activity.
13. Android提供了5种方式存储数据,(1)使用SharedPreferences存储数据,它是Android提供的用来存储一些简单配置信息的一种机制,采用了XML格式将数据存储到设备中。只能在同一个包内使用,不能在不同的包之间使用.(2)文件存储数据;文件存储方式是一种较常用的方法,在Android中读取/写入文件的方法,与Java中实现I/O的程序是完全一样的,提供了openFileInput()和openFileOutput()方法来读取设备上的文件。(3)SQLite数据库存储数据;SQLite是Android所带的一个标准的数据库,它支持SQL语句,它是一个轻量级的嵌入式数据库。(4)使用ContentProvider存储数据;主要用于应用程序之间进行数据交换,从而能够让其他的应用保存或读取此Content Provider的各种数据类型。(5)网络存储数据;通过网络上提供给我们的存储空间来上传(存储)和下载(获取)我们存储在网络空间中的数据信息。
14. Activity: 活动,一个活动就是一个用户可以操作的可视化用户界面,每一个活动都被实现为一个独立的类,并且从活动基类继承而来。Intent: 意图,最重要的部分是动作和动作对应的数据。Content Provider:内容提供器,android应用程序能够将它们的数据保存到文件、SQLite数据库中,甚至是任何有效的设备中。当你想将你的应用数据和其他应用共享时,内容提供器就可以发挥作用了。
15. view是最基础的,必须在UI主线程内更新画面,速度较慢。SurfaceView 是view的子类,类似使用双缓机制,在新的线程中更新画面所以刷新界面速度比view快, GLSurfaceView 是SurfaceView的子类,opengl 专用的。
16. (1)所有的应用程序都必须有数字证书,Android系统不会安装一个没有数字证书的应用程序
(2)Android程序包使用的数字证书可以是自签名的,不需要一个权威的数字证书机构签名认证
(3)如果要正式发布一个Android程序,必须使用一个合适的私钥生成的数字证书来给程序签名,而不能使用adt插件或者ant工具生成的调试证书来发布。
(4)数字证书都是有有效期的,Android只是在应用程序安装的时候才会检查证书的有效期。如果程序已经安装在系统中,即使证书过期也不会影响程序的正常功能。
17. LinearLayout有两个非常相似的属性:android:gravity与android:layout_gravity。我们可以通过设置android:gravity="center"来让EditText中的文字在EditText组件中居中显示;同 时我们设置EditText的android:layout_gravity="right"来让EditText组件在LinearLayout中居右显示
18. 注册广播接收者:首先写一个类要继承BroadcastReceiver
第一种:在清单文件中声明,添加
<receiveandroid:name=".IncomingSMSReceiver" >
<intent-filter>
<actionandroid:name="android.provider.Telephony.SMS_RECEIVED")
<intent-filter>
<receiver>
第二种使用代码进行注册如:
IntentFilterfilter= newIntentFilter("android.provider.Telephony.SMS_RECEIVED");
IncomingSMSReceiverreceiver= new IncomgSMSReceiver();
registerReceiver(receiver.filter);
1)第一种是常驻型(静态注册),也就是说当应用程序关闭后,如果有信息广播来,程序也会被系统调用自动运行。
2)第二种不是常驻型广播(动态注册),也就是说广播跟随程序的生命周期。
19.双缓冲技术原理:创建一幅后台图像,将每一帧画入图像,然后调用drawImage()方法将整个后台图像一次画到屏幕上去.要分配一个后台图像的缓冲,如果图像相当大,这将占用很大一块内存。
20. AsyncTask我们通常会将耗时的操作放在单独的线程执行,避免其占用主线程而给用户带来不好的用户体验。但是在子线程中无法去操作主线程(UI线程),在子线程中操作UI线程会出现错误. android提供了一个类Handler来在子线程中来更新UI线程,用发消息的机制更新UI界面,呈现给用户.时的任务操作总会启动一些匿名的子线程,太多的子线程给系统带来巨大的负担,随之带来一些性能问题。因此android提供了一个工具类AsyncTask,顾名思义异步执行任务.不再需要子线程和Handler就可以完成异步操作并且刷新用户界面。
21. Socket通信编程,
客户端编程步骤:
1、 创建客户端套接字(指定服务器端IP地址与端口号)
2、 连接(Android 创建Socket时会自动连接)
3、 与服务器端进行通信
4、 关闭套接字
服务器端:
1.创建一个ServerSocket,用于监听客户端Socket的连接请求
2.采用循环不断接受来自客户端的请求
3.每当接受到客户端Socket的请求,服务器端也对应产生一个Socket