Android:使用 Intent 链接多个活动

Intent是Android各组件之间进行交互的一种重要方式,通常被用于启动活动、启动服务以及发送广播等场景。android

显式Intent:

Intent有多个构造函数重载,其中一个Intent(Context packageContext,Class cls)。第一个参数要求提供一个启动活动的上下文,第二个参数是指向想要启动的目标活动。建立好Intent后,用**startActivity()**方法启动便可。浏览器

以下,在 MainActivity 中的一个按钮的点击后,启动 first_activitybash

public void onClick(View v) {
     Intent intent = new Intent(MainActivity.this,first_activity.class);
     startActivity(intent);
}
复制代码

隐式 Intent:

隐式 Intent不像显式那样明确指出要启动哪个活动,而是指定一系列更为抽象的actioncategory等信息,只有当actioncategory信息彻底匹配时才能成功启动。app

首先在AndroidManifest.xml中的 ****标签下配置 ****内容,以下:ide

<activity android:name=".second_activity" >
      <intent-filter>
           <action android:name="com.lodge.myapplication.ACTION_START" />
           <category android:name="android.intent.category.DEFAULT" />
      </intent-filter>
</activity>
复制代码

其中 标签中指明活动能够响应com.lodge.myapplication.ACTION_START 。而后在另外一个 activity中按钮的点击事件添加以下代码:函数

button_2.setOnClickListener(new View.OnClickListener() {
     @Override
     public void onClick(View v) {
         Intent intent = new Intent("com.lodge.myapplication.ACTION_START");     //隐式Intent;
         startActivity(intent);
     }
});
复制代码

这里的 intent是另外一个构造函数,直接将action的字符串传了进去,表示想要启动可以响应com.lodge.myapplication.ACTION_START这个 action的活动。另外,由于category参数设置为android.intent.category.DEFAULT ,表明默认设置,因此在intent中未加入category。 其实每一个intent中只能指定一个action,但却能指定多个category。例如:ui

button_2.setOnClickListener(new View.OnClickListener() {
     @Override
     public void onClick(View v) {
        Intent intent = new Intent("com.lodge.myapplication.ACTION_START");     //隐式Intent;
        intent.addCategory("com.lodge.myapplication.MY_CATEGORY");
        startActivity(intent);
     }
});
复制代码

固然,在AndroidManifest.xml中****标签下的 ****里也要添加 内容,以下:this

<activity android:name=".second_activity" >
     <intent-filter>
         <action android:name="com.lodge.myapplication.ACTION_START" />
         <category android:name="android.intent.category.DEFAULT" />
         <category android:name="com.lodge.myapplication.MY_CATEGORY" />
     </intent-filter>
</activity>
复制代码

更多隐式intent:

使用隐式intent启动其余程序的活动。例如打开系统浏览器,在按钮点击事件中添加以下代码:spa

button_3.setOnClickListener(new View.OnClickListener() {
       @Override
       public void onClick(View v) {
           Intent intent = new Intent(Intent.ACTION_VIEW);             //更多隐式Intent;
           intent.setData(Uri.parse("http://www.baidu.com"));
           startActivity(intent);
       }
});
复制代码

这里的Intent.ACTION_VIEW是内置动做。code

向下一个活动传递数据:

Intent中的putExtra()方法能够把咱们想要传递的数据保存在Intent中,启动另外一个活动后,再把数据从Intent中取出便可。

//上一个活动传送数据;
button.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View v) {
          String data = "hello intent put_Extra";
          Intent intent = new Intent(MainActivity.this,first_activity.class);
          intent.putExtra("extra_data",data);     //传递数据,第一个参数是键值,后一个参数是要传递的数据;
         startActivity(intent);
     }
});
 
//下一个活动获取数据;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_first);
 
    Intent intent = getIntent();        //获取用于启动本activity的intent;
    String data = intent.getStringExtra("extra_data");      //传入相应键值,得到数据;
    Log.d("first_activity",data);       //打印数据;
}
复制代码

返回数据给上一个活动:

Activity中有一个**startActivityForResult()**方法也是用于启动活动的,可是这个方法指望在活动销毁的时候可以返回一个结果给上一个活动。

//启动活动;
button.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View v) {
          Intent intent = new Intent(MainActivity.this,second_activity.class);
          startActivityForResult(intent,1);    //接收启动的下一个活动返回的数据,第二个参数是请求码,只要是惟一值就行,这里是 1 ;
      }
});
 
@Override
//重写onActivityResult()方法,用于响应startActivityForResult()方法启动的活动;
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
    switch (requestCode)
    {
        case 1:
           if(resultCode == RESULT_OK)
           {
                String returnedData = data.getStringExtra("return_data");
                Log.d("main_activity",returnedData);
           }
           break;
    }
}
 
 
//子活动设置按钮销毁活动(return_button) ;
@Override
protected void onCreate(Bundle savedInstanceState) { 
   super.onCreate(savedInstanceState);
   setContentView(R.layout.activity_second);
 
   Button button = findViewById(R.id.return_button);
 
   button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent = new Intent();
            intent.putExtra("return_data","hello main_activity!");
            setResult(RESULT_OK,intent);
            finish();       //销毁当前活动;
        }
    });
}
 
 
@Override
//重写按下返回键的方法,实现与 return_button 相同的功能;
public void onBackPressed() {
    Intent intent = new Intent();
    intent.putExtra("return_data","hello back to main_activity!");
    setResult(RESULT_OK,intent)
    finish();       //销毁当前活动;
}
复制代码
相关文章
相关标签/搜索