android知识点总结

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 Queueandriod提供了 Handler  Looper 来满足线程间的通信;Looper: 一个线程可以产生一个Looper对象,由它来管理此线程里的Message Queue(消息队列)Handler 先进先出原则,可以构造Handler对象来与Looper沟通,以便push新消息到Message Queue;或者接收LooperMessage Queue取出)所送来的消息。

andler获取当前线程中的looper对象,looper用来从存放MessageMessageQueue中取出Message,再有Handler进行Message的分发和处理.

Looper也把消息队列里的消息广播给所有的HandlerHandler接受到消息后调用handleMessage进行处理,

判断Handler对象里面的Looper对象是属于哪条线程的,则由该线程来执行

    1. Handler对象的构造函数的参数为空,则为当前所在线程的Looper

    2.Looper.getMainLooper()得到的是主线程的Looper对象,Looper.myLooper()得到的是当前线程的Looper对象。

 

4.      默认情况下,一个Android程序也只有一个Process,但一个Process下却可以有许多个Thread所有这个程序中的ActivityService都会跑在这个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层,当然需要进行javajavascript之间的通信。模型层(model):数据库的操作、对网络等的操作都应该在model里面处理,当然对业务计算等操作也是必须放在的该层的;控制层(controller):android的控制层的重任通常落在了众多的acitvity的肩上,这句话也就暗含了不要在acitivity中写业务代码,要通过activity交给model层做业务逻辑的处理  android中的acitivity的响应时间是5s,如果耗时的操作放在这里,程序就很容易被回收掉。第一步:继承Servicepublic class SMSService extends Service {}第二步:在AndroidManifest.xml文件中的节点里对服务进行配置: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()函数,就会马上跳转到名为TestBActivity中。 

隐式匹配(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);}  

完成以后又会来找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()方法来读取设备上的文件。3SQLite数据库存储数据;SQLiteAndroid所带的一个标准的数据库,它支持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:gravityandroid:layout_gravity我们可以通过设置android:gravity="center"来让EditText中的文字在EditText组件中居中显示;同 时我们设置EditTextandroid:layout_gravity="right"来让EditText组件在LinearLayout中居右显示

18.  注册广播接收者:首先写一个类要继承BroadcastReceiver

第一种:在清单文件中声明,添加

  

第二种使用代码进行注册如:

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

 

你可能感兴趣的:(android,skill)