創(chuàng)建一個(gè)Activity的實(shí)現(xiàn)類很是簡單,有如下代碼即可:
public class myActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
一般需要重寫onCreate方法,并通過setContentView設(shè)置布局文件。完事后,我們還需要在AndroidManifest.xml中對(duì)Activity進(jìn)行注冊。
1. 需要配置啥
創(chuàng)建一個(gè)Activity子類后,需要在AndroidManifest.xml中進(jìn)行注冊,所謂注冊就是寫一段如下配置字段
<activity android:name="myActivity"
android:label="@string/Activity_label"
android:icon="@drawable/ic_launcher_background"
android:exported="true"
android:launchMode="standard">
<intent-filter>
<action android:name="android.intent.action.QQ" />
</intent-filter>
</activity>
說一下這些代表什么意思:
- android:name="myActivity",用于指定Activity實(shí)現(xiàn)類的類名,該名必須和類名相同
- android:label="@string/Activity_label",用于指定該Activity的標(biāo)簽
- android:icon="@drawable/ic_launcher_background",指定圖標(biāo)
- android:exported="true",配置該Activity是否可以被其他應(yīng)用調(diào)用
- android:launchMode="standard",配置Activity的加載模式,不同的加載模式介紹可以參考Activity系列——加載模式。
- <intent-filter ... >,指定一個(gè)或多個(gè)intent-filter,用于說明該Activity可以響應(yīng)哪些Intent。
3. 怎么使用
一個(gè)Android應(yīng)用一般包含多個(gè)Activity,其中有一個(gè)比較特殊,它是整個(gè)程序的入口,我們不妨叫它MainActivity,Android啟動(dòng)時(shí)會(huì)自動(dòng)啟動(dòng)這個(gè)Activity。為何啟動(dòng)這個(gè)呢?因?yàn)檫@個(gè)MainActivity的配置中寫了這些東西
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
android.intent.action.MAIN,指定應(yīng)用程序最先啟動(dòng)的Activity android.intent.category.LAUNCHER,表示activity應(yīng)該被列入系統(tǒng)的啟動(dòng)器(launcher)(允許用戶啟動(dòng)它)。Launcher是安卓系統(tǒng)中的桌面啟動(dòng)器,是桌面UI的統(tǒng)稱。
MainActivity是自動(dòng)啟動(dòng)執(zhí)行的,其它Activity則可以有MainActivity直接或間接啟動(dòng)。一個(gè)Activity啟動(dòng)其它Activity有兩種方法,如下
- startActivity(Intent intent)
通過給定的Intent啟動(dòng)相應(yīng)的Activity
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Intent intent = new Intent(MainActivity.this, myActivity.class);
startActivity(intent);
}
}
- startActivityForResult(Intent intent, int requestCode),注意requestCode需要 >= 0,否則沒有返回,可參考https://blog.csdn.net/yanzhenjie1003/article/details/99656633
多了一個(gè)請(qǐng)求碼參數(shù),使用該方法啟動(dòng)Activity時(shí),程序會(huì)等待新啟動(dòng)Activity返回的結(jié)果,當(dāng)然這需要重寫onActivityResult方法
用一個(gè)例子來說明第二種,例如在MainActivity中使用這個(gè)方法啟動(dòng)myActivity,并等待其返回結(jié)果。那么,MainActivity是如何獲取到返回結(jié)果的呢?myActivity被啟動(dòng)后,何時(shí)返回結(jié)果并確定,開發(fā)者需要重寫onActivityResult方法來等待被回調(diào)。
@Override
public void onActivityResult(int requestCode, int resultCode, Intent intent) {
super.onActivityResult(requestCode, resultCode, intent);
if (requestCode == 0 && resultCode == 0) {
Bundle data = intent.getExtras();
String result = data.getString("code");
show.setText(result);
}
}
而在myActivity中需要通過setResult設(shè)置一個(gè)返回值resultCode。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
bt1 = findViewById(R.id.bt1);
bt1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = getIntent();
intent.putExtra("code","你好,中國");
myActivity.this.setResult(0,intent);
myActivity.this.finish();
}
});
}
4. 用例詳細(xì)代碼
myActivity.java
public class myActivity extends Activity {
public Button bt1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
bt1 = findViewById(R.id.bt1);
bt1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = getIntent();
intent.putExtra("code","你好,中國");
myActivity.this.setResult(0,intent);
myActivity.this.finish();
}
});
}
}
MainActivity.java
public class MainActivity extends AppCompatActivity {
public TextView show;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
show = findViewById(R.id.show);
Intent intent = new Intent(MainActivity.this, myActivity.class);
startActivityForResult(intent,0);
//requestCode要>=0,否則沒有返回
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent intent) {
super.onActivityResult(requestCode, resultCode, intent);
if (requestCode == 0 && resultCode == 0) {
Bundle data = intent.getExtras();
String result = data.getString("code");
show.setText(result);
}
}
}
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.myapplication">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name="myActivity"
android:label="@string/app_name"
android:icon="@drawable/ic_launcher_background"
android:exported="true"
android:launchMode="standard">
<intent-filter>
<action android:name="android.intent.action.QQ" />
</intent-filter>
</activity>
</application>
</manifest>
5. AndroidManifest.xml文件配置Activity補(bǔ)充
參考原文https://blog.csdn.net/wusuobupo/article/details/52833357