一、Activity相互跳转
Activity之间主要通过Intent进行相互跳转。
Intent是一种运行时绑定(run-time binding)机制,可以应用于两个应用间的通讯交互,也能够应用于在同一个应用下不同组件的交互(activity、service、broadcast receiver)。
跳转方式分为显式Intent和隐式Intent。
显式Intent
需要知道要跳转的包名和类名,
Intent intent = new Intent(Context packageContext, Class<?> cls);
startActivity(Intent)
参数:
Context packageContext:程序根据其判断要跳转的包名。假设上述代码是写在MainActivity中,则此处写MainActivity.this。(如果在类中的内部类或本类中引用了其他类的方法(或重写)的时候,使用this指内部类或者其他的类,而不是外部类。此时MainActivity.this != this)
Class<?>cls:组件类,相当于从之前的Activity跳转到这个组件类。假设此处是FirstActivity,则写FirstActivity.class。
隐式Intent
首先需要在Manifest包下找到AndroidManifest.xml文件,对需要跳转的Activity进行如下修改:
<activity
<!--这里是对Activity的注册(例如 android:name=".FirstActivity") -->
>
<intent-filter>
<action android:name="com.example.activitytest.ACTION_START" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
因此代码可以写成:
Intent intent = new Intent("com.example.activitytest.ACTION_START");
startActivity(intent);
二、数据传输
发送数据
承接上文相互跳转,数据传输使用的是Intent下的putExtra方法。其源码(快捷键Ctrl+Shift+I)如下:
public Intent putExtra(String name, @Nullable String value) {
throw new RuntimeException("Stub!");
}
可以看出其是以键值对的方式传递值的。
接收数据
在接收数据的Activity中编写如下
String text = getIntent().getStringExtra(key); //key是发送数据键值对中的key
TextView textView = findViewById(R.id.tv);
textView.setText(text);
这里是用TextView接收数据。
一键关闭
这里使用的是单栈模式。
首先需要在Manifest包下找到AndroidManifest.xml文件,对最底层的Activity(一般为MainActivity)进行如下修改:
android:launchMode="singleTask"
然后在最底层的Activity中重写方法onNewIntent()。
public static final String EXIST = "exist";
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
if (intent != null) {
boolean isExist = intent.getBooleanExtra(EXIST, false);
if (isExist) {
this.finish();
}
}
}
最后在一键关闭的Activity中调用putExtra()传递值到最底层的Activity中:
intent.putExtra(MainActivity.EXIST, true);