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的話會拋出異常。