10天看完第一行程式碼--第一天
列印日誌
log.v列印最基礎
log.d除錯資訊,傳遞兩個引數一個是tag一般是當前類名,對於列印資訊進行過濾,第二個是msg列印的具體內容。
log.i比較重要
log.w列印警告
log.e列印錯誤
級別從低到高,可以新增過濾器。
比system.out的好處有級別區分,有時間過濾,等快捷鍵logd+tab
小技巧在onCreat外邊輸入logt+tab可以直接生成tag,親測有效。
遇到問題不識別手機,殺死了adb還是不識別網上說的手機開啟開發者模式什麼都沒問題就是不識別,我決定終極大招RRR就是重啟Android studio。當然也沒有效果,原因竟然是我沒有開啟除錯模式。我使用的是oppoA33m。
Activity活動包含使用者元件,主要和使用者進行互動。建立一個新專案ActiviyTest,選擇add no Activity手動建立活動。此時切換到project模式下可以看到 app/src/main/java/activitytest下為空。需要我們手動在此目錄下建立activity右鍵 -->new -->activity-->empty activity,不選中生成xml檔案。此時onCreat方法
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); }載入佈局res-->new-->directory layout->layout resource file
對於佈局稍加編輯,新增一個button
<Button android:id="@+id/bt_1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="button1"/>接著在onCreat方法中呼叫setContentView,接著在Mainfest.xml檔案中註冊 ,設定成主活動(在intent-filter中設定標籤action category)總結來說 建立activity,建立佈局,引入佈局,註冊
1.給Button新增監聽 程式碼
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.first_layout); Button bt = new Button(this); bt=(Button) findViewById(R.id.bt_1);//獲取檔案中定義的元素返回view 向下轉型為button bt.setOnClickListener(new View.OnClickListener() { //設定監聽 彈出吐司 @Override public void onClick(View v) { Toast.makeText(FirstActivity.this,"you clic bt1",Toast.LENGTH_SHORT).show(); } }); }
2.使用menu(現在很少使用menu了)
定義選單,渲染選單,定義選單響應事件。
注意細節 返回true表示顯示選單。
3.銷燬活動 點選返回鍵或者呼叫finish().
Intent在活動間跳轉(顯式跳轉和隱式跳轉)
1.顯式跳轉
Intent intent = new Intent(FirstActivity.this,SecondActivity.class); startActivity(intent);//跳轉方法
2.隱式跳轉不指明想要啟動哪一個活動而是通過action 和 category找到可以響應的activity。每一個Inten只能指一個acion,但是能指定多個category。
<activity android:name=".SecondActivity"> <intent-filter> <action android:name="android.intent.action.ACTION_START"/>//當前活動可以響應的action <category android:name="android.intent.category.DEFAULT"/>//帶有的category同時響應才能匹配intent <category android:name="android.intent.category.MY_Category"/> </intent-filter> </activity>
隱式跳轉方法二
intent1.setData(Uri.parse("http://www.baidu.com"));//可以直接解析網頁,呼叫了系統的瀏覽器Intent intent1 = new Intent(Intent.ACTION_VIEW);intent1.setData(Uri.parse("http://www.baidu.com"));//Uri.parse接收一個Uri物件,資料以字串的形式傳入Uri.parse中 startActivity(intent1);//跳轉方法
補充Intent標籤中的data標籤用於更精確的響應當前活動能響應什麼型別的資料。當data中的內容和Intetn中指定的data的內容完全一致時,才會響應。
有時候需要清除瀏覽器的預設設定才會出現跳轉頁面選擇視窗,不要這樣寫誘導使用者的行為不好。
還有其他的協議geo顯示地理位置 tel打電話;
intent1.setData(Uri.parse("tel:10086"));向下一個活動之間傳遞資料
Intent中提供了方法putExtra()方法,有兩個引數第一個是鍵,第二個是值。在另外一個Activity中取出值的方法getStringExtra(),getIntExtra()根據傳入的值的型別不同而有選用不同的方法。
在firstActivity中和secondActivity中程式碼
intent.putExtra("extra_data","data"); startActivity(intent);
Intent intent = getIntent(); String data = intent.getStringExtra("extra_data"); Log.d(TAG, data);
通過getIntent方法獲取用於啟動SecondActivity的Intent,然後呼叫getStringExtra傳入相應的鍵值
返回資料給上一個活動
startActivityForResult()在活動銷燬的時候返回一個結果給上一個Activity。該方法有兩個引數第一個引數是Intent,第二個引數是返回碼用於在之後的資料中判斷來源。@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) {//啟動活動時傳入的請求碼 返回資料時傳入的處理結果 攜帶者返回資料的Intent switch (requestCode){ case 1: if (resultCode == RESULT_OK) { String returndata = data.getStringExtra("data_return"); Log.d("FirstActivity", returndata); } break; default: } }
)由於每一個活動都有可能呼叫OnActivityResult方法所以檢查requestCode值檢查資料來源,確定資料是來源於SecondActivity後之後判斷處理結果是否成功列印data。好亂我自己都沒有打印出來。待我重新理一下啊。os:雖然我想放棄,但是我想到了萬一我以後工作了遇到同樣的問題我能放棄嗎不能。重新看一遍啊。
1.startActivityForResult(Intent intent,Int requestCode) 2.setResult(RESULT_OK,intent)->finish 3.onActivityResult(requestCode,resultCode,Intent data)
錯誤原因:requestCode和resultCode沒有區分。請求碼來判斷資料來源,resultCode判斷處理結果是否成功。
返回棧
Android是使用任務來管理活動的,一個任務就是放在一組棧裡面的集合。棧是一種先進後出的資料結構。在預設情況下,每當我們啟動一個新的活動就會在返回棧裡面入棧,並且處於棧頂。back鍵或者finish()棧頂活動出棧。
活動的狀態和生命週期
1.執行狀態 2.暫停狀態 3.停止狀態 4.銷燬狀態onCreate()完成一些初始化操作,比如載入佈局和繫結事件。
onStart()此方法活動由不可見變為可見的時候呼叫。
onResume()活動準備好和使用者進行互動的時候呼叫。活動此時位於棧頂,執行狀態。
onPause()此方法在系統準備去啟動或者恢復另一個活動的時候呼叫。將消耗cpu的資源釋放掉,儲存一些關鍵資料。
onStop() 活動完全不可見時呼叫。和onPause的區別是對話方塊式的活動不會呼叫OnPause()方法。
onDestory()活動銷燬前呼叫
onRestart()活動由停止變為執行的時候呼叫。
可見生命週期 onStart onStop()onStart對於資源進行載入,onStop()對於資源進行釋放。
前臺生命週期 onResum onPause 活動處於執行狀態。
對話方塊式的活動在Manifest檔案中設定Activity標籤的theme屬性為Dialog。列印TAG的快捷鍵logt+tab。
下面是一個文字版的生命週期的例子,三個Activity MainActivity NormalActivity DialogActivity NormalActivity上線性佈局兩個按鈕分別跳轉NormalActivity 和DialogActivity
生命週期的變化 MainActivity(onCreate-->onStart-->onResume)
點選第一個按鈕啟動normalActivity MainActivity(onPause()-->onStop())點選back MainActivity(onRestart()->onStart()->onResume)螢幕黑屏onPause() onStop()
點選第二個按鈕啟動DialogActivity MainActivity()(onPaues())點選back MainActivity (onResume) 只是進入暫停狀態
MainActivity()下點選back鍵MainActivity() (onPause-->onStop->onDestory()).
有一種活動被回收的情況,啟動活動A後啟動B,A被回收了。點選B的返回鍵,A活動被重新建立但是A儲存的臨時資料沒有了,解決辦法onSaveInstanceState()當活動被回收之前一定會被呼叫。例子:
@Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); String temp = "Something you just tyoed"; outState.putString("temp_data",temp); }
對應取出onCreate()中的Bundle平時為null,有值時傳入值。修改onCreate()方法如下Intent和Bundle傳值類似,Intent和Bundle可以一起使用。存入時先把資料存入Bundle中,再把Bundle物件存入Intent中。取出時先取出Bundle物件,再取出值。protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); if (savedInstanceState != null) { String temp = savedInstanceState.getString("temp_data"); Log.d(TAG, "onCreate: "+temp); }
活動的啟動模式
Mainfest檔案中Activity標籤的launchMode屬性
1.standard 標準模式,系統每次啟動活動都會重新在返回棧中建立該活動。
2singleTop 棧頂模式 在啟動活動時如果活動位於棧頂就不再建立該活動,當活動未處於棧頂時,還是會重新建立。
3.singleTask 唯一模式,每次啟動活動時都會在返回棧中檢查是否有該活動。沒有建立位於棧頂,有直接使用該例項並把該例項上的其他活動全部出棧。。
4.singleInstance 不會翻譯啦,指定為該模式的活動,會重新建一個新的返回棧管理這個活動。此模式可以實現讓其他程式呼叫該活動,共享該活動的例項。
每一個程式都有自己的返回棧,不同的返回棧如棧時建立了新的例項,singleInstance模式下會有一個單獨的返回棧來管理這個活動,不管哪一個應用程式來訪問該活動都公用一個返回棧,解決了共享活動的例項問題。通過TaskId可以判斷活動不在同一個返回棧中。
知道當前是哪一個活動頁面,新建BaseActivity繼承AppCompatActivity在onCreate方法中log.d(""baseActivity”,getClass().getSimpleName()),FirstActivity SecondActivity繼承BaseActivity
隨時隨地退出程式,新建專門的集合類對於活動進行管理。程式碼如下:
修改baseActivity的程式碼如下public class ActivityCollector { public static List<Activity> activities = new ArrayList<>(); public static void addActivity(Activity activity){ activities.add(activity); } public static void removeActivity(Activity activity){ activities.remove(activity); } public static void finishallActivity(){ for (Activity activity : activities) { if (!activity.isFinishing()) { activity.finish(); } } } }
public void onCreate(Bundle savedInstanceState, PersistableBundle persistentState) { super.onCreate(savedInstanceState, persistentState); ActivityCollector.addActivity(this); Log.d("BaseActivity", getClass().getSimpleName()); } @Override protected void onDestroy() { super.onDestroy(); ActivityCollector.removeActivity(this); }
殺死程序
android.os.Process.killProcess(android.os.Process.myPid());
啟動活動的最佳寫法在要啟動的活動裡面寫靜態方法actionStart(Context context ,String data,String data1)
溝通交流qq 2296657181.說10天看完是因為我之前看過一遍有Android基礎的。