Android基礎知識點的整理

1、什麼是Activity?

是一個可以與用戶交互的屏幕,例如打電話、拍照、地圖、日曆的界面

An Activity is an applicationcomponent that provides a screen with which users can interact in order to dosomething, such as dial the phone, take a photo, send an email, or view a map.

2、Activity 生命週期。

1)對象從創建到銷燬有哪些狀態

 創建、運行、暫停、停止、銷燬、

2) 狀態之間的切換會觸發哪些方法

狀態/狀態切換觸發方法

1. 加載

2. 運行       onCreate()  onStart() onResume()

3. 暫停       onPause

4. 停止       onStop

5. 關閉       onDestroy

當Activity處於暫停或停止狀態時,可能被強制結束

進程優先級:

1、Activity startForeground

2、Faused

3、background start

4、onStop Activity

5、empty 爲了下次更快啓動繼承

Activity從創建到銷燬有多種狀態,從一種狀態到另一種狀態時會激發相應的回調方法,這些回調方法包括:oncreate ondestroy onstop onstart onresume onpause

其實這些方法都是兩兩對應的,onCreate創建與onDestroy銷燬;

onStart可見與onStop不可見;onResume可編輯(即焦點)與onPause;

對話框的彈出, Activity.this

對話框是activity的一部分.

這6個方法是相對應的,那麼就只剩下一個onRestart方法了,這個方法在什麼時候調用呢?

答案就是:在Activity被onStop後,但是沒有被onDestroy,在再次啓動此Activity時就調用onRestart(而不再調用onCreate)方法;

如果被onDestroy了,則是調用onCreate方法。

最後講自己項目中的經驗,比如說豆瓣客戶端每次進入某個界面的時候都要看到最新的數據,這個刷新列表的操作 就放在onStart()的方法裏面.

fillData() 這樣保證每次用戶看到的數據都是最新的.

多媒體播放, 播放來電話. onStop()視頻, 視頻聲音設置爲0 , 記錄視頻播放的位置 mediaplayer.pause();

onStart() 根據保存的狀態恢復現場.mediaplayer.start();

3、兩個Activity之間跳轉時必然會執行的是哪幾個方法

答:A:onPause onStop

    B:onCreate onStart  onResume

一般情況比如說有兩個Activity,分別叫A和B,當在A裏面激活B組件的時候,A會調用onPause()方法,然後B調用onCreate(),onStart(),onResume()這個時候B覆蓋了窗體,A會調用onStop()方法,如果B,是透明的,或是對話框的樣式,就不會調用onStop()方法

4、橫豎屏切換時候Activity的生命週期

清單沒有配置:重新創建配置

configChanges=keyboardhidden|orientation|screeSize

screenOrientation="port"

這個生命週期跟清單文件裏的配置有關係

1、不設置Activity的android:configChanges時,切屏會重新調用各個生命週期

默認首先銷燬當前activity,然後重新加載

Onpause Onstop Ondestory Oncreate Onstart Onresume

2、設置Activity的android:configChanges=“onrientation|keybarHidden”時,切屏不會重新調用各個生命週期,只會執行onConfigurationChanged方法

5. 如何將一個Activity設置成窗口的樣式。

android:theme="@android:style/Theme.Dialog"

6、你後臺的Activity被系統 回收怎麼辦?如果後臺的Activity由於某原因被系統回收可了,如何在被系統回收之前保存當前狀態?

onSaveInstanceState()

7、如何退出Activity?如何安全退出已調用多個Activity的Application?

答:(1)退出activity直接調用finish()方法。//用戶點擊back鍵就是退出一個activity

    退出activity會執行onDestroy()方法

(2)、拋異常強制退出

該方法通過拋異常,使程序Force Close

驗證可以,但是需要解決的問題是,如何使程序結束掉,而不彈出Force Close窗口

//安全結束進程

      android.os.Process.killProcess(android.os.Process.myPid());

System.exit(0)

(3)記錄打開的Activity:

  ClassMyApplication extends Application

  {

PrivateList<Activity> lists = new List<Activity>();

PrivateMyApplication()

{

}

 Public static MyApplication()

{

 

}

每打開一個Activity,就記錄下來。在需要退出時,關閉每一個Activity即可。

                 List<Activity>lists ; 在application 全集的環境裏面

           lists =new ArrayList<Activity>();

每一個activity在執行oncreate()方法的時候 lists.add(this);

Ondestory() lists.remove(this);

lists.add(activity);

 

for(Activity activity: lists)

{

      activity.finish();

}

(4)發送特定廣播:

在需要結束應用時,發送一個特定的廣播,每個Activity收到廣播後,關閉即可。

//給某個activity 註冊接受接受廣播的意圖  

      registerReceiver(receiver,filter)

 

//如果過接受到的是 關閉activity的廣播  就調用finish()方法把當前的activity finish()掉

 8、service是否在main thread中執行, service裏面是否能執行耗時的操作?

默認情況,如果沒有顯示的指定service所運行的進程, Service和activity是運行在當前app所在進程的main thread(UI主線程)裏面 

service裏面不能執行耗時的操作(網絡請求,拷貝數據庫,大文件 )

在子線程中執行 new Thread(){}.start();

IntentService

Onhandler()

特殊情況 ,可以在清單文件配置 service 執行所在的進程 ,

讓service在另外的進程中執行

<service

android:process="cn.itcast.xxx"></service>

 9、兩個Activity之間怎麼傳遞數據?

基本數據類型可以通過.  Intent 傳遞數據 

extras.putDouble(key,value)

intent.putExtra(name,value) 

// 通過intent putExtra 方法基本數據類型都傳遞

      Bundle bundle = new  Bundle();

      bundle.putShort(key, value);

      intent.putExtras(bundle);

      intent.putExtras(bundle)

獲取到激活他的 getIntent();

        Intent intent =getIntent();

        Bundle bundle =intent.getExtras();

Bundle 類似map的集合

intent.getStringExtra("key","value");

intent.getBooleanExtra("key","value")

Application 全局裏面存放 對象 ,自己去實現自己的application的這個類,基礎系統的application , 每個activity都可以取到

 讓對象實現 implements  Serializable接口把對象存放到文件上. 

讓類實現Serializable接口,然後可以通過ObjectOutputStream         //對象輸出流

           File file = newFile("c:\\1.obj");

           FileOutputStreamfos  =new FileOutputStream(file);

           ObjectOutputStreamoos = newObjectOutputStream(fos);

          

           Student stu = newStudent();

           stu.setId("10001");

           stu.setName("zs");

           oos.writeObject(stu);

          

          

           FileInputStream fis= newFileInputStream(file);

           ObjectInputStreamois = newObjectInputStream(fis);

            Student stu1 = (Student) ois.readObject();

           System.out.println(stu1.getName());

 

Parcelable 和Serializable

 

Parcelable 把對象序列化到android操作系統的一塊公用的內存空間

文件/網絡

 

//傳遞數據的引用

10. 怎麼樣在啓動一個Activity時就啓動一個service?

在activity的onCreate()方法裏面 startService();

11、同一個程序,但不同的Activity是否可以放在不同的Task任務棧中?

比方說在激活一個新的activity時候, 給intent設置flag

singleinstance 

單獨的任務棧

Intent的flag添加FLAG_ACTIVITY_NEW_TASK

   這個被激活的activity就會在新的task棧裏面…

      Intent intent= new Intent(A.this,B.class);

      intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

      startActivity(intent);

12、Activity怎麼和service綁定,怎麼在activity中啓動自己對應的service?

startService() 一旦被創建  調用着無關   沒法使用service裏面的方法 

bindService () 把service 與調用者綁定 ,如果調用者被銷燬, service會銷燬

bindService() 我們可以使用service 裏面的方法

      bindService().  讓activity能夠訪問到 service裏面的方法

      構建一個intent對象,

Intentservice = new Intent(this,MyService.class);

 通過bindService的方法去啓動一個服務,

   bindService(intent, new MyConn(),BIND_AUTO_CREATE);

      ServiceConnection對象(重寫onServiceConnected和OnServiceDisconnected方法) 和BIND_AUTO_CREATE.

      private classmyconn implements ServiceConnection

      {//異步的操作, 可能需要花費若干秒的時間

           publicvoid onServiceConnected(ComponentName name, IBinder service) {

                 //TODO Auto-generated method stub

                 //可以通過IBinder的對象 去使用service裏面的方法

           }

           publicvoid onServiceDisconnected(ComponentName name) {

                 //TODO Auto-generated method stub    

           }    

      }

什麼是Service以及描述下它的生命週期。Service有哪些啓動方法,有什麼區別,怎樣停用Service?

在Service的生命週期中,被回調的方法比Activity少一些,只有onCreate, onStart, onDestroy,

onBind和onUnbind。

A Service is an applicationcomponent that can perform long-running operations in the background and doesnot provide a user interface.

通常有兩種方式啓動一個Service,他們對Service生命週期的影響是不一樣的。

1 通過startService

    Service會經歷 onCreate 到onStart,然後處於運行狀態,stopService的時候調用onDestroy方法。

   如果是調用者自己直接退出而沒有調用stopService的話,Service會一直在後臺運行。

2 通過bindService  

    Service會運行onCreate,然後是調用onBind, 這個時候調用者和Service綁定在一起。調用者退出了,Srevice就會調用onUnbind->onDestroyed方法。

   所謂綁定在一起就共存亡了。調用者也可以通過調用unbindService方法來停止服務,這時候Srevice就會調用onUnbind->onDestroyed方法。

需要注意的是如果這幾個方法交織在一起的話,會出現什麼情況呢?

 

一個原則是Service的onCreate的方法只會被調用一次,就是你無論多少次的startService又bindService,Service只被創建一次。

如果先是bind了,那麼start的時候就直接運行Service的onStart方法,如果先是start,那麼bind的時候就直接運行onBind方法。

 

如果service運行期間調用了bindService,這時候再調用stopService的話,service是不會調用onDestroy方法的,service就stop不掉了,只能調用UnbindService, service就會被銷燬

 

 

如果一個service通過startService被start之後,多次調用startService 的話,service會多次調用onStart方法。多次調用stopService的話,service只會調用一次onDestroyed方法。

 

 

如果一個service通過bindService被start之後,多次調用bindService的話,service只會調用一次onBind方法。

 

多次調用unbindService的話會拋出異常。

 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章