使用Intent跳转活动
显示Intent
通过Activity类中提供的startActivity方法直接启动活动
//使用Toast通知小消息,通过静态方法makeTest创建一个Toast对象,然后调用show方法显示Toast //参数:上下文(活动本身就是一个Context对象),文本内容,显示时长 Toast.makeText(MainActivity.this, "MainActivity", Toast.LENGTH_SHORT).show(); Button button = (Button) findViewById(R.id.button_1); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //在MainActivity活动的基础上打开SecondActivity活动,显示intend启动 Intent intent = new Intent(MainActivity.this, SecondActivity.class); startActivity(intent); } });
隐式Intent
AndroidManifest
在<activity>标签下配置<intent-filter>的内容,指定当前活动能够响应的action和category
每个Intent只能指定一个action,但可以指定多个category
<activity android:name=".ThirdActivity" android:label="ThirdActivity"> <!--使用隐式Intent,action和category都匹配上时才会响应--> <intent-filter> <action android:name="com.example.myactivitytest.MY_Action" /> <!--DEFAULT是默认category,调用startActivity时会自动将这个category添加到Intend中--> <category android:name="android.intent.category.DEFAULT" /> <category android:name="com.example.myactivitytest.MY_CATEGORY" /> </intent-filter> </activity> </application>
SecondActivity
Toast.makeText(SecondActivity.this, "SecondActivity", Toast.LENGTH_SHORT).show(); Button button = (Button) findViewById(R.id.button_1); button.setOnClickListener(new View.OnClickListener(){ @Override public void onClick(View v) { //隐式intent启动ThirdActivity Intent intent = new Intent("com.example.myactivitytest.MY_Action"); intent.addCategory("com.example.myactivitytest.MY_CATEGORY"); startActivity(intent); } });
当然,也可Android系统内置的动作启动其他程序的活动,如Intent.ACTION_VIEW启动系统浏览器。
数据的传递
向下个活动传递消息
若要向下个活动传递数据,可直接通过Intent的putExtra方法及相应的get方法获取
//向下个活动传递数据 String data = "Hello SecondActivity"; Intent intent = new Intent(FirstActivity.this, SecondActivity.class); intent.putExtra("extra_data", data); //将数据暂存在intent中,(name,value);
//读取上个活动传递的数据 Intent intent = getIntent(); String data = intent.getStringExtra("extra_data"); Log.d("SecondActivity", data);
返回数据给上个活动
由于返回上个活动并不需要一个Intent来启动活动,所以数据的传递相应的要麻烦些。
使用startActivityForResult方法启动活动,这个方法可以在活动销毁时返回一个结果给上一个活动
//返回数据给上一个活动 Intent intent = new Intent(FirstActivity.this, SecondActivity.class); //请求码只要是唯一值即可,之后回调中判断数据来源 startActivityForResult(intent, 1);
在启动的活动中,通过setResult方法返回数据
public void onClick(View v) { Intent intent = new Intent(); intent.putExtra("data_return", "Hello FirstActivity"); //(处理结果,带有数据的intent) //处理结果一般只使用RESULT_OK或RESULT_CANCELED setResult(RESULT_OK, intent); //销毁活动 finish(); }由于是通过startActivityForResult方法启动活动的,在启动的活动被销毁后会回调上一个活动的onActivityResult方法,因此,可通过重写该方法获得返回的数据
//得到上个返回的数据 protected void onActivityResult(int requestCode, int resultCode, Intent data) { switch(requestCode) { case 1: if(resultCode == RESULT_OK) { String returnedData = data.getStringExtra("data_return"); if(returnedData != null) { Log.d("FirstActivity", returnedData); } else { Log.d("FirstActivity", "return is null"); } } break; default: } }