《第一行代碼-Android》學(xué)習(xí)筆記1

本文適合于對Android開發(fā)有一定了解,正在Android入門中的小白
Github源碼:無

Let's Go Android!

  • Android 四大組件:
    Activity、Service、Broadcast、Content Provider

  • (1) R.java文件:在項(xiàng)目中添加的任何資源文件都會(huì)在其中生成一個(gè)相應(yīng)的資源id,這個(gè)文件永遠(yuǎn)不要試圖手動(dòng)修改它。
    (2)AndroidManifest.xml文件:在程序中定義的四大組件都需要在這個(gè)文件里注冊。
    (3)AndroidManifest.xml文件中注冊的Activity中,帶有如下代碼的表示App啟動(dòng)后首先激活的Activity(第一個(gè)界面)
    <intent-filter>
    <action android:name="android.intent.action.MAIN" />

              <category android:name="android.intent.category.LAUNCHER" />
          </intent-filter>
    

比如,如下兩個(gè)Activity,ActivityLogin是首先激活的Activity,而ActivityMain則是普通的Activity,需要通過其他方式啟動(dòng)。
<activity
android:name=".ActivityLogin"
android:label="@string/app_name"
android:theme="@style/AppTheme.NoActionBar">
<intent-filter>
<action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity android:name=".ActivityMain"
        android:theme="@style/Theme.AppCompat.Light.NoActionBar"/>
  • Android程序講究邏輯和視圖分離;
    Android程序不推薦在程序中對字符串進(jìn)行硬編碼。
    ①字符串的定義都是在string.xml文件中使用鍵值對的形式。
    ②在代碼中通過R.string.hello_world可以獲得該字符串的引用;
    在XML中通過@string/hello_world可以獲得該字符串的引用。
  • 使用Log打印日志而不要使用System.out
    Log.i("TAG","Some information to print");
    理由有很多,剛開始的時(shí)候我也喜歡用System.out,后來逐漸體會(huì)到了Log的優(yōu)點(diǎn):五個(gè)級別的日志分級別過濾,日志篩選器以及使用最多的關(guān)鍵字過濾等
    如下,兩行代碼
Log.i("TAG_1","something 1");
Log.i("TAG_2","Something 2");

①當(dāng)沒有篩選條件時(shí),日志打印如下(多而雜):



②當(dāng)篩選條件是"TAG"時(shí),日志打印如下:



③當(dāng)篩選條件是"TAG_1"時(shí),日志打印如下:
  • 在XML中引用一個(gè)id,語法@id/id_name;
    在XML中定義一個(gè)id,語法:@+id/id_name
  • 去除界面的標(biāo)題欄,可以在配置文件的Activity注冊信息中將theme屬性改為:
    android:theme="@style/Theme.AppCompat.NoActionBar">
    網(wǎng)上有許多通過代碼設(shè)置去除標(biāo)題欄的方法,實(shí)測好多都不成功
  • findViewById()方法返回的是一個(gè)View對象,我們需要將它向下轉(zhuǎn)型轉(zhuǎn)成Button/TextView/EditText/…等對象
    registerTxv = (TextView) findViewById(R.id.text_view_register);
  • 銷毀一個(gè)活動(dòng)(出棧),調(diào)用Activity類中的finish()方法即可,效果等同于按下了Back鍵;
  • 創(chuàng)建目錄menu(效果如下圖):



    I:在res目錄下新建menu子文件夾-->新建menu布局文件,添加item子菜單項(xiàng);

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <group android:checkableBehavior="single">
        <item
            android:id="@+id/seek_mode_menu_item"
            android:icon="@mipmap/ic_near_me_white_24dp"
            android:title="Add" />
        <item
            android:id="@+id/setting_menu_list"
            android:icon="@mipmap/ic_settings_white_24dp"
            android:title="Remove" />
    </group>
</menu>

II:在Activity中重寫onCreatOptionMenu()方法,顯示菜單;

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.main,menu);
    return true;
}

III:在Activity中重寫onOptionItemSelected()方法,定義菜單響應(yīng)事件。

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()){
        case R.id.add_item:
            Toast.makeText(MainActivity.this, "Add", Toast.LENGTH_SHORT).show();
            break;
        case R.id.remove_item:
            Toast.makeText(MainActivity.this, "Remove", Toast.LENGTH_SHORT).show();
            break;
        default:
            break;
    }
    return true;
}
  • Intent的啟動(dòng)活動(dòng):
    (1)顯式Intent
Intent  intent = new Intent(MainActivity.this, AnotherActivity.class);
startActivity(intent);

(2)隱式Intent
①通過在<activity>標(biāo)簽下配<intent-filter>的內(nèi)容,可以指定當(dāng)前活動(dòng)能夠響應(yīng)的action和category,只有<action>和<category>里的內(nèi)容全部匹配時(shí),這個(gè)活動(dòng)才能響應(yīng)該Intent;
②每個(gè)Intent中只能指定一個(gè)action,但卻可以指定多個(gè)category(intent.addCategory(…));
③一個(gè)activity可以對應(yīng)多個(gè)<action>和多個(gè)<category>,只要某個(gè)intent中的action和category在這個(gè)activity中存在即可響應(yīng);
④若兩個(gè)不同的Activity(可以來自不同的App)均可以響應(yīng)某一個(gè)intent,則會(huì)彈出下面的窗口。若有不同的軟件都可以處理某一功能時(shí)進(jìn)行選擇

注意:<category android:name="android.intent.category.DEFAULT"/>是一種默認(rèn)的category,在調(diào)用startActivit()時(shí)可以自動(dòng)添加這個(gè)category到intent中去,所以每個(gè)Activity若增加了<intent-filter>標(biāo)簽,則必須加入<category android:name="android.intent.category.DEFAULT"/>,否則不會(huì)產(chǎn)生匹配(不匹配原因:系統(tǒng)認(rèn)為默認(rèn)的category項(xiàng)目沒有存在于Activity中)。

⑤使用隱式Intent,我們不僅可以啟動(dòng)自己程序內(nèi)的活動(dòng),還可以啟動(dòng)其他程序的活動(dòng)。setDate(),它接受一個(gè)Uri對象,主要用于指定當(dāng)前Intent正在操作的數(shù)據(jù),而這些數(shù)據(jù)通常都是以字符串的形式傳入到Uri.parse()方法中解析產(chǎn)生的,例如:
intent.setData(Uri.parse("http://www.baidu.com"));
intent.setData(Uri.parse("tel:10086"));
我們還可以在<intent-filter>標(biāo)簽中再配置一個(gè)<date>標(biāo)簽,用于更精確地指定當(dāng)前活動(dòng)能夠響應(yīng)什么類型的數(shù)據(jù)。

<activity android:name=".FifthActivity">
    <intent-filter>
        <action android:name="android.intent.action.VIEW"/>
        <category android:name="android.intent.category.DEFAULT"/>
        <data android:scheme="http"/>
    </intent-filter>
</activity>

例:上面這個(gè)Activity可以響應(yīng)http協(xié)議的intent。

  • Intent傳遞數(shù)據(jù)
    (1)向下一個(gè)活動(dòng)傳遞數(shù)據(jù):
    intent.putExtra(“鍵值對名稱”,鍵值對內(nèi)容);
    例:
Intent intent = new Intent(thisActivity.this,MainActivity.class);
intent.putExtra("Data", 123);
startActivity(intent);

從新啟動(dòng)的活動(dòng)中得到上個(gè)活動(dòng)通過Intent傳過來的數(shù)據(jù)
Intent intent = getIntent();
例:

Intent receivedIntent = getIntent();
 int receiveData = receivedIntent.getIntExtra("Data",0);

getIntExtra()的第二個(gè)參數(shù)是默認(rèn)參數(shù),即:出現(xiàn)錯(cuò)誤無法從Intent取出數(shù)據(jù)時(shí),receiveData 的默認(rèn)賦值
(2)返回?cái)?shù)據(jù)給上一個(gè)活動(dòng)
Activity中還有一個(gè)startActivityForResult(Intent intent , int requestCode)方法也是用于啟動(dòng)活動(dòng)的,但這個(gè)方法期望在活動(dòng)銷毀的時(shí)候能夠返回一個(gè)結(jié)果給上一個(gè)活動(dòng);
setResult(int resultCode , Intent intent)方法,專門用于向上一個(gè)活動(dòng)返回?cái)?shù)據(jù),第一個(gè)參數(shù)用于返回處理結(jié)果,一般只用RESULT_OK , RESULT_CANCELED這兩個(gè)值;一般還要在后啟動(dòng)的Activity里面重寫onBackPressed()方法;
onActivityResult(int requestCode , int resultCode , Intent data)方法,用于接收返回的數(shù)據(jù)。
例:
①.Activity-A啟動(dòng)Activity-B

Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
startActivityForResult(intent, 1);

②.Activity-B銷毀后返回?cái)?shù)據(jù)給Activity-A(backImgBtn的點(diǎn)擊事件是銷毀SecondActivity)

        backImgBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent();
                intent.putExtra("data_return", "Hello FirstActivity");
                setResult(RESULT_OK, intent);
                finish();
            }
        });

③.Activity-A中接受Activity-B銷毀時(shí)返回的數(shù)據(jù)

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        switch (requestCode) {
            case 1:
                if (resultCode == RESULT_OK) {
                    String returnedData = data.getStringExtra("data_return");
                    Log.i("FirstActivity",returnedData);
                }
                break;
            default:
                break;
        }
    }

鏈接:《第一行代碼》作者郭霖--博客



原創(chuàng)文章,轉(zhuǎn)載請注明出處: http://www.itdecent.cn/p/4aacc6be9d51

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容