1. 程式人生 > >10天看完第一行程式碼--第一天

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()方法如下
 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);
        }
Intent和Bundle傳值類似,Intent和Bundle可以一起使用。存入時先把資料存入Bundle中,再把Bundle物件存入Intent中。取出時先取出Bundle物件,再取出值。
活動的啟動模式

Mainfest檔案中Activity標籤的launchMode屬性

1.standard 標準模式,系統每次啟動活動都會重新在返回棧中建立該活動。

2singleTop 棧頂模式 在啟動活動時如果活動位於棧頂就不再建立該活動,當活動未處於棧頂時,還是會重新建立。

3.singleTask 唯一模式,每次啟動活動時都會在返回棧中檢查是否有該活動。沒有建立位於棧頂,有直接使用該例項並把該例項上的其他活動全部出棧。。

4.singleInstance 不會翻譯啦,指定為該模式的活動,會重新建一個新的返回棧管理這個活動。此模式可以實現讓其他程式呼叫該活動,共享該活動的例項。

每一個程式都有自己的返回棧,不同的返回棧如棧時建立了新的例項,singleInstance模式下會有一個單獨的返回棧來管理這個活動,不管哪一個應用程式來訪問該活動都公用一個返回棧,解決了共享活動的例項問題。通過TaskId可以判斷活動不在同一個返回棧中。

知道當前是哪一個活動頁面,新建BaseActivity繼承AppCompatActivity在onCreate方法中log.d(""baseActivity”,getClass().getSimpleName()),FirstActivity SecondActivity繼承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();
            }
        }
    }

}
修改baseActivity的程式碼如下
   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基礎的。