本文適合于對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
