时间:2022-10-13 14:15:05 | 栏目:Android代码 | 点击:次
Android开发少不了的就是页面之间的跳转,或者想要呼叫打开其他应用等
Intent是Android程序中各组件之间进行交互的一种重要方式,不仅可以指明当前组件想要执行的运作,还可以在不同组件之间传递数据。
第一个参数为启动活动的上下文
第二个参数为想要启动的目标活动
Intent intent = new Intent(MainActivity.this, TabHostActivity.class); startActivity(intent);
通过这个构造函数就可以构建出Intent的“意图”,且目标明确,所以为显示启动
根据 <intent-filter>
中设定的 action 和 category 来启动,且只有<action>和<category>
中的内容同时能够匹配上时,这个活动才能响应。
Intent intent = new Intent("com.zqunyan.zgstudy.ACTION_START"); intent.addCategory("com.zqunyan.zgstudy.MY_CATEGORY"); startActivity(intent);
如果 <intent-filter>
中的 category
值是 android.intent.category.DEFAULT
则可以省略addCategory(),因为DEFAULT是一种默认的 category,在调用 startActivity() 方法的时候会自动添加到 intent 中,即
Intent intent = new Intent("com.zqunyan.zgstudy.ACTION_START"); startActivity(intent);
使用隐式 Intent,我们不仅可以启动自己程序内的活动,还可以启动其他程序的活动。
action指定为Intent.ACTION_VIEW
,其常量值为 android.intent.action.VIEW
然后将网页地址转换成 Uri 对象传递进去
Intent intent = new Intent(Intent.ACTION_VIEW); intent.setData(Uri.parse("https://www.baidu.com")); startActivity(intent);
action指定为 Intent.ACTION_DIAL
Intent intent = new Intent(Intent.ACTION_DIAL); intent.setData(Uri.parse("tel:10086")); startActivity(intent);
借助androdi内部的 PackageManager 来根据包名取得应用的启动页面
Intent intent = getPackageManager().getLaunchIntentForPackage("com.zqunyan.zgwidget"); if(intent != null){ intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent); }
常用于打开系统设置界面,用于一些快捷功能设置。借助 Component 来实现
如:下面实例打开华为手机的设置页面
Intent intent = new Intent(); ComponentName componentName = new ComponentName("com.android.settings", "com.android.settings.Settings$DisplaySettingsActivity"); intent.setComponent(componentName); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent);
跳转按钮点击事件
Intent intent = new Intent(MainActivity.this, ReturnValueActivity.class); //第二个参数用于处理返回结果是判断是哪个语句调用的 startActivityForResult(intent, 1); //requestCode = 1
处理返回结果
@Override protected void onActivityResult(int requestCode, int resultCode, Intent intent){ super.onActivityResult(requestCode, resultCode, intent); if(requestCode == 1){ if(resultCode == 1){ String content = intent.getStringExtra("content"); lblStatus.setText("success"); }else{ lblStatus.setText("fail"); } } }
跳转界面传回返回值,并关闭界面
实例化一个空的 Intent绑定数据到 IntentsetResult() 回传结果值和绑定了数据的 Intent关闭自身,主画面接收返回结果
Intent intent = new Intent(); intent.putExtra("content", txtMessage.getText().toString()); //setResult第一个参数为结果码,常用的有Activity.RESULT_OK、RESULT_CANCELED或者自定义整数型结果码 // 第二个参数为返回值,返回值封装在Intent中 setResult(1, intent); finish();
传值
intent.putExtra("uname", "admin");
取值
Intent intent = getIntent(); String name = intent.getStringExtra("uname")
用于在 Activity 之间传送值或数组资料,好处是当一个页面跳转多个页面时,可以共用bundle。
简单值
打包
Bundle bundle = new Bundle(); bundle.putString("NAME", "QY"); bundle.putInt("AGE", 18); bundle.putDouble("TALL", 175.86); bundle.putStringArrayList("lstFilePaths", lstFilePaths); intent.putExtras(bundle);
收包
Intent intent = this.getIntent(); Bundle bundle = intent.getExtras(); String strName = bundle.getString("NAME"); int intAge = bundle.getInt("AGE"); ArrayList<String> lstFilePaths = bundle.getStringArrayList("lstFilePaths");
StringArrayList
正常传值都为单个实际值,如果想要传送列表数据则一般通过构造函数或参数传递,直接通过 bundle 只能传送 StringArrayList 简单列表类型
自定义数据类
首先将自定义的数据类序列化,即继承 implements Serializable 接口
数据类
public class GoodsInfoModule implements Serializable {}
传值
bundle.putSerializable("goodsInfo", goodsInfo);
取值
goodsInfo = (GoodsInfoModule) bundle.getSerializable("goodsInfo");