Activity的七大属性包括:
ComponentName Extra Flags Category Action Data Type
1) ComponentName : 指定了ComponentName属性的Intent已经明确了它将要启动哪个组件,因此这种Intent被称为显式Intent,没有指定ComponentName属性的Intent被称为隐式Intent。隐式Intent没有明确要启动哪个组件,应用会根据Intent指定的规则去启动符合条件的组件
Componentname可以实现跳转至其他页面也可以实现跳转至其他应用 代码示例如下:
xmlCode:
"1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" app:layout_behavior="@string/appbar_scrolling_view_behavior" tools:showIn="@layout/activity_main"> <Button android:id="@+id/btn_01" android:onClick="btnClick" android:text="跳转至其他页面" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <Button android:id="@+id/btn_02" android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="btnClick" android:layout_below="@id/btn_01" android:text="跳转至其他程序"/> RelativeLayout>javaCode:
import android.content.ComponentName; import android.content.Intent; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.view.View; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); getSupportActionBar().hide(); } public void btnClick(View view){ switch (view.getId()){ case R.id.btn_01: // 1.componentname 跳转页面 使用的显示意图 就借助这个属性 Intent intent = new Intent(); ComponentName componentName = new ComponentName(MainActivity.this,ThridActivity.class); intent.setComponent(componentName); startActivity(intent); break; case R.id.btn_02: // 2.componentname 跳转到其他应用 Intent intent1 = new Intent(); //1参.目标应用的包名 //2参.目标应用的Activity的全路径 ComponentName componentName1 = new ComponentName("zhanghao.androidday06_activityforbitmap", "zhanghao.androidday06_activityforbitmap.MainActivity"); //把封装的显示动作放到意图中 intent1.setComponent(componentName1); //开启意图 startActivity(intent1); break; } } }
2)Flags: 通过设置Flag,我们可以设定一个Activity的启动模式,这个和launchMode基本上是一样的.
javaCode:
import android.annotation.SuppressLint; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.widget.TextView; import java.text.SimpleDateFormat; import java.util.Date; public class MainActivity extends BaseActivity { public final static String TAG ="MainActivity"; private TextView textView; @SuppressLint("SimpleDateFormat") @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); this.addActivityIntance(this); textView = (TextView)findViewById(R.id.text); } public void setClick(View v ){ Intent intent = new Intent(MainActivity.this,SecondActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP); //setFlags只能设置三种启动模式 //1.如果不设置,就是默认! //2.如果flags 为Flag_activity_single_top 相当于 清单文件中的-->singleTop //3.Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP //两个结合起来相当于-->singleTask //注意 flags属性不能设置 singleIntance startActivity(intent); } }
3)Extras: 用于在Activity之间传递数据,Extra可以传递基本类型,String类型以及实现了Serializable或者Parcelable接口的类
javaCode:
import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; import android.view.View; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } public void textClick(View view){ Intent intent = new Intent(); intent.setClass(MainActivity.this, SecondActivity.class); //利用extra属性 进行传值 intent.putExtra("send", "我要告诉你!一个秘密!!"); intent.putExtra("it", 94250); intent.putExtra("qq", true); //开启意图 startActivity(intent2); } }SecondActivity接收传来的值:
import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.widget.Toast; public class SecondActivity extends Activity{ @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.secondlayout); Intent intent = getIntent(); //获取传递过来的意图 if (intent != null) { //不为空,去Intent中取值 根据Key获取传递过来的字符串数据 String sendString = intent.getStringExtra("send"); //defaultValue 默认值 如果key没有对应的值,就返回默认值 int it = intent.getIntExtra("it", 250); //获取boolean类型 boolean qq =intent.getBooleanExtra("qq", false); Toast.makeText(this, sendString+it+qq, Toast.LENGTH_LONG).show(); } } }
Action Category Type Data 基本上一起使用 我们放在一起介绍如下:
4)Action: intent中的Action我们在使用广播的时候用的比较多,在Activity中,我们可以通过设置Action来隐式的启动一个Activity,比如我们有一个ThirdActivity,我们在清单文件中做如下配置:
<activity android:name=".ThirdActivity" > <intent-filter> <action android:name="custom1" /> <action android:name="custom2" /> <category android:name="category1" /> <category android:name="android.intent.category.DEFAULT" /> <data android:mimeType="text/*" android:scheme="http" /> intent-filter> activity>当我们在清单文件中做了这样的配置之后,我们的ThirdActivity会就会响应这个动作.
5)Category: 我们使用这种隐式启动的方式来启动一个Activity的时候,必须要action和category都匹配上了,该Activity才会成功启动。如果我们没有定义category,那么可以暂时先使用系统默认的category,总之,category不能没有。
6)Data: Data属性通常用于向Action属性提供操作的数据。Data属性的值是个Uri对象。通过设置data,我们可以执行打电话,发短信,开发网页等等操作.
7)Type: Type属性用于指定Data所指定的Uri对应的MIME类型。MIME只要符合“abc/xyz”这样的字符串格式即可。
javaCode:
import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.view.View; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } //通过隐士意图去开启SecondActivity //开启的条件:匹配过滤器中的action category data public void btnClick(View view){ Intent intent = new Intent(); //intent中只能设置一个Action,如果设置两个 后面的会覆盖前面的Action intent.setAction("custom1"); //category可以有多个但是必须要满足全部匹配才算成功 intent.addCategory("category1"); intent.addCategory("android.intent.category.DEFAULT"); //如果既想设置Data 又想设置Type 那么,只需要设置setDataAndtype即可 intent.setDataAndType(Uri.parse("http://www.baidu.com"),"text/plain"); startActivity(intent); } }