《第一行代碼》第二章

《第一行代碼》第二章總結

上一章總結是在看完後寫的,感受遺漏不少,從這章起是邊閱讀邊總結。java

因爲有了新的事情,《第一行代碼》的總結要停一段時間,但不會過久。android


手動建立活動

  • 選擇 Add No Activity ,建立一個活動。
  • 在res 下建立 layout 文件夾,在文件夾下建立 first_layout 佈局。
  • 在佈局中添加一個按鈕。
  • 在活動中加載佈局。
  • 在AndroidManifest 文件中註冊。
  • 在AndroidManifest 中配置主活動,在 內部加入

在活動中使用Toast():

  • 在 onCreat()中添加。app

    Button button1 = (Button) findViewById(R.id.button_1);
    button1.setOnClickListener(new View.OnClickListener(){					//註冊監聽器
        public void onClick(View v){
            Toast.makeText(MainActivity.this, "You clicked Button 1", Toast.LENGTH_SHORT).show();
        }
    
    });
  • 經過findViewById()方法得到佈局元素,返回的是View對象,(Button)轉型成Button對象。ide

  • 爲按鈕註冊監聽器。佈局

    • makeText ( Context對象, 文本內容, 時長).show()。 時長有:Toast.LENGTH_SHORT 與 Toast.LENGTH_LONG

    Ps:在這裏設置了自動導包this

@+id/xxx 在 xml 定義一個idcode

@id/xxx 在 xml 引入一個idorm


在活動中使用Menu:

  • res下建立menu文件夾,建立main,建立 標籤建立菜單項。 xml

    <item
        android:id="@+id/app_item"
        android:title="Add"/>
    <item
        android:id="@+id/remove_item"
        android:title="Remove"/>
  • 在活動中添加onCreatetionsMenu(),使用getMenuInflater().inflate(R.menu.main,menu),第一個參數爲建立菜單的資源文件,第二個參數爲菜單項添加到的Menu對象。對象

    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main,menu);
        return true;
    }
  • 定義菜單響應事件,在活動中重寫onOptionsItemSelected(),經過調用item.getItemId() 來判斷咱們點擊的是哪個菜單項。

    public boolean onOptionsItemSelected(MenuItem item){
        switch (item.getItemId()){
            case R.id.app_item:
                Toast.makeText(this,"You clicked Add",Toast.LENGTH_SHORT).show();
                break;
            case R.id.remove_item:
                Toast.makeText(this,"You clicked Remove",Toast.LENGTH_SHORT).show();
                break;
            default:
        }
        return  true;
    }


銷燬一個活動:

  • 修改按鈕監聽器中的代碼(我把以前的代碼註釋掉了):

    button1.setOnClickListener(new View.OnClickListener(){
        public void onClick(View v){
            //Toast.makeText(MainActivity.this, "You clicked Button 1", Toast.LENGTH_SHORT).show();
            finish();
        }
    
    });

Intent篇

使用顯式Intent

Ps:Intent是Android程序中各組件之間進行交互的一種重要方式。

  • 建立第二個活動

  • 修改第一個活動中按鈕的點擊事件(一樣註釋):

    button1.setOnClickListener(new View.OnClickListener(){
        public void onClick(View v){
            //Toast.makeText(MainActivity.this, "You clicked Button 1", Toast.LENGTH_SHORT).show();
            //finish();
            Intent intent = new Intent(MainActivity.this,SecondActivity.class);
            startActivity(intent);
        }
    
    });
  • 先構建Intent ,傳入MainActivity.this 做爲上下文,傳入 SecondActivity.class 做爲目標活動。

  • 經過startActivity()方法執行Intent。

  • 按下back鍵銷燬當前活動,回到上一個活動。


使用隱式Intent

  • 標籤下配置 的內容

    <activity android:name=".SecondActivity">
        <intent-filter>
            <action android:name="com.example.androidtest.ACTION_START"/>
            <category android:name="android.intent.category.DEFAULT"/>
        </intent-filter>
    </activity>
  • 修改MainActivity中按鈕的點擊事件

    button1.setOnClickListener(new View.OnClickListener(){
        public void onClick(View v){
            //Toast.makeText(MainActivity.this, "You clicked Button 1", Toast.LENGTH_SHORT).show();
            //finish();
            //Intent intent = new Intent(MainActivity.this,SecondActivity.class);
            //startActivity(intent);
            Intent intent = new Intent("com.example.androidtest.ACTION_START");
            startActivity(intent);
        }
    
    });
  • 標籤聲明當前活動能夠響應 com.example.androidtest.ACTION_START 這個活動, 標籤包含了一些附加信息,更精確指明當前活動可以響應的Intent中還可能帶有的category。 只有 同時匹配上Intent 中指定的action 和 category 時,這個活動才能響應該 Intent。

  • android.intent.category.DEFAULT 是一種默認的 category ,在調用 startActivity 方法時會自動將這個category 添加到 Intent 中。


更多隱式Intent

  • 修改主活動爲

    button1.setOnClickListener(new View.OnClickListener(){
        public void onClick(View v){
            Intent intent = new Intent(Intent.ACTION_VIEW);		//指定Intent的action爲Intent.ACTION_VIEW,爲安卓內置動做
          
       intent.setData(Uri.parse("http://www.baidu.com"));
            startActivity(intent);	//經過Uri.parse()方法,將網址字符串解析成Uri對象,再調用setData()方法傳遞這個Uri對象。
  • setData()接受一個Uri對象,用於指定當前Intent正在操做的數據。


接上

  • 建立活動 ThirdActivity 與 third_layout

  • 在 AndroidManifest.xml中註冊

  • 進行配置

    <activity android:name=".ThirdActivity"
                tools:ignore="AppLinkUrlError">
                <intent-filter>
                    <action android:name="android.intent.action.VIEW"/>
                    <category android:name="android.intent.category.DEFAULT"/>
                    <data android:scheme="http"/>
                </intent-filter>
            </activity>
  • tools:ignore="AppLinkUrlError" 經過提示增長!


向下一個活動傳遞數據

  • 修改主活動:

    public void onClick(View v){
        String data = "Hello SecondActivity";
        Intent intent = new Intent(MainActivity.this,SecondActivity.class);
        intent.putExtra("extra_data",data);	//接受兩個參數,第一個是鍵
        startActivity(intent);
    }
  • 修改 SecondActivity :

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.second_layout);
        Intent intent = getIntent();	//獲取用於啓動SecondActivity的Intent
        String data = intent.getStringExtra("extra_data");
        Log.d("SecondActivity",data);
    }

返回數據給上一個活動

  • 主活動中寫入:

    public void onClick(View v){
        Intent intent = new Intent(MainActivity.this,SecondActivity.class);
        startActivityForResult(intent,1);	//在活動銷燬的時候返回一個結果給上一個活動。第二個參數是請求碼,用於在以後的回調中判斷數據的來源。
    }
  • SecondActivity:

    button2.setOnClickListener(new View.OnClickListener(){
        public void onClick(View v){Intent intent = new Intent();
            intent.putExtra("data_return","Hello 主活動");
            setResult(RESULT_OK, intent);	//重要!專門用於上一個活動返回數據。第一個參數用於向上一個活動返回處理結果,通常只用RESULT_OK 或 RESULT_CANCELED這兩個值,第二個參數則吧帶有數據的Intent 傳遞回去。
            finish();}	//銷燬活動
    });
    • 主活動重寫 onActivityResult(): 回調的方法
    protected void onActivityResult(int requestCode,int resultCode, Intent data) {	//第一個參數是活動傳入的請求碼1,第二個參數是在返回數據時傳入的處理結果RESULT_OK。
        super.onActivityResult(requestCode, resultCode, data);  //注意
        switch (requestCode) {
            case 1:
                if (requestCode == RESULT_OK) {
                    String returnedData = data.getStringExtra("data_return");
                    Log.d("MainActivity", returnedData);
                }
                break;
            default:
        }
    }

經過back返回

  • 在以上的基礎上,在SecondActivity 中重寫:

    public void onBackPressedf(){
        Intent intent = new Intent();
        intent.putExtra("data_return","Hello 主活動");
        setResult(RESULT_OK,intent);
        finish();
    }


活動週期篇

  • 每一個活動在其生命週期中最多可能會有4種狀態。
    • 運行狀體
    • 暫停狀態
    • 中止狀態
    • 銷燬狀態

體驗活動的生命週期

  • 新建項目,建立主活動、兩個子活動(NormalActivity、DialogActivity)與對應的佈局。兩個子活動佈局各添加一個TextView,主活動佈局添加兩個button。

  • 修改AndroidManifest.xml:

    <activity android:name=".DialogActivity" android:theme="@android:style/Theme.Dialog"></activity>
  • 修改主活動代碼:

    展開查看
    private static final String TAG = "MainActivity";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button startNormalActivity = (Button) findViewById(R.id.start_normal_activity);
        Button startDialogActivity = (Button) findViewById(R.id.start_dialog_activity);
        startNormalActivity.setOnClickListener(new View.OnClickListener(){
            public void onClick(View v){
                Intent intent = new Intent(MainActivity.this,NormalActivity.class);
                startActivity(intent);
            }
        });
        startDialogActivity.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(MainActivity.this,DialogActivity.class);
            }
        });
    }
    @Override
    protected void onStart() {
        super.onStart();
        Log.d(TAG,"onStart");
    }
    @Override
    protected void onResume() {
        super.onResume();
        Log.d(TAG,"onResume");
    }
    @Override
    protected void onPause() {
        super.onPause();
        Log.d(TAG,"onPause");
    }
    @Override
    protected void onStop() {
        super.onStop();
        Log.d(TAG,"onStop");
    }
    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.d(TAG,"onDestory");
    }
    @Override
    protected void onRestart() {
        super.onRestart();
        Log.d(TAG,"onRestart");
    }

活動的啓動模式

standard

  • standard是活動默認的啓動模式。
  • 使用standard模式的活動,每次啓動都會建立該活動的一個新的實例。

singelTop

  • 啓動活動時若發現返回棧的棧頂已是該活動,則認爲能夠直接使用它,再也不建立新的活動實例。

  • 修改AndroidManifest.xml:

    在activity標籤內加android:launchMode="singleTop"

singelTask

  • 每次啓動活動時系統首先會在返回棧中檢查是否存在該活動的實例,若是發現已經存在則直接使用該實例,並把在這個活動之上的全部活動通通出棧,若是發現沒有就會建立一個新的活動實例。

singleInstance*

  • 指定爲singleInstance 模式的活動會啓用一個新的返回棧來管理這個活動

瞭解當前活動的技巧

  • 新建一個類(Java Class):無需註冊

    public class BaseActivity extends AppCompatActivity {		//繼承AppCompatActivity!
        @Override
        protected void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            Log.d("BaseActivity",getClass().getSimpleName());
        }
    }
  • 讓全部類繼承 BaseActivity

出現的問題

  • 每次運行出現這樣的錯誤信息:…… E/eglCodecCommon: glUtilsParamSize: unknow param 0x00008cdf
    …… E/eglCodecCommon: glUtilsParamSize: unknow param 0x00008824
  • 按照示例在隱式Intent活動中添加intent.addCategory(……)沒有按照書裏說的報錯但程序運行終止了。
  • 在<體驗活動生命週期>處的試驗中,點擊第二個對話的按鈕沒反應,程序也沒報錯,網上兩個方法都沒用。
相關文章
相關標籤/搜索