安卓开发-Activity的显示意图和隐式意图+实例+Activity界面间数据的传递实例

《一:显示意图和隐式意图》
1.显示意图

//想打开的页面需要在创建意图时显式指定要打开那个Activity
Intent intent = new Intent(this, 指定Activity.class);
startActivity(intent);

2.隐式意图:没有说明要打开哪一个页面,而是通过匹配来确定怎么打开,若一个匹配就直接打开,多个匹配则以列表的形式选择打开(当应用只想和其他应用交互时才会用到)

第一种:只设置action

                在开启方MainActivity中
Intent intent = new Intent();
//想启动某个页面,可以为页面配置一个ACTION属性(也可在意图构造器中传入action类型创建意图)
intent.setAction("包名.action.自定义名称");

startActivity(intent);
<!-- 1.被开启方AndroidManifest.xml中(对应activity中)-->
<intent-filter>
   <action android:name="包名.action.自定义名称" />
   <!-- 2.本界面默认的页面,如果配置了一个或多个action标签,category标签必须配置 -->
   <category android:name="android.intent.category.DEFAULT" />
</intent-filter>

第二种:intent.setAction()不是必须的,但是得配置dataAndType

            开启方MainActivity中
Intent intent = new Intent();

//1.告诉系统想启动一个带有浏览器action的界面
intent.setAction("android.intent.action.VIEW");//浏览器显示界面action
//2.创建uri的型数据
Uri data = Uri.parse(网址);//创建uri
//3.告诉系统该展示成什么样的格式
intent.setDataAndType(data, "text/html");//为意图设置data和type

startActivity(intent);


            被开启方AndroidManifest.xml中(对应activity中)
<intent-filter >
   <!-- 1.若请求uri(data)必须配置此action的值,sms可不配 -->
   <action android:name="android.intent.action.VIEW" />
   <!-- 2.本界面默认的页面,如果配置了一个或多个action标签,category标签必须配置 -->
   <category android:name="android.intent.category.DEFAULT" />
   <!-- 3.如果配置了data,则必须配置action,不管代码中是否有setAction -->
   <data android:mimeType="类型" android:scheme="网址头(如http)" android:host="主机地址"
     android:port="端口" android:path="子文件路径" />
</intent-filter>

《二:界面间数据的传递【显式意图传值方式】(界面一到界面二)》

1.界面一中:

//1.创建意图时指定打开界面二
Intent intent = new Intent(界面一的Activity.this, 界面二的Activity.class);
//2.1为界面二的意图中设置需要传递的数据类型: 名称和值
intent.putExtra(String name, dataTypeValue);
//2.2为界面二的意图中设置需要传递的对象(对象必须实现序列化接口)
intent.putExtra(String objName, obj);
//3.启动意图
startActivity(intent);

2.相应界面二中:

Intent intent = getIntent();

//2.1直接指定数据类型获取值
dataType name = (dataType) intent.getIntExtra(dataName, 无值返回);
//2.2获取Extras再从中获取值
dataType name = (dataType) intent.getExtras().get(dataName);
//2.3获取实现序列化接口对象
objType obj = (objType) intent.getExtras().getSerializable(objName)

《三:隐式意图实例-隐式浏览器和激活系统短信》(当应用只想和其他应用交互时才会用到)

(1)隐式浏览器 (目的:当用户点击一个网址时,选用自定义的webview打开(隐式弹出的列表选择),而不是系统自带的浏览器)

1.启动浏览器 查看启动Activity意图的日志。
图片

2.查看 浏览器 的源代码中的AndroidManifest.xml文件,找到对应的应用,复制相应的intent-filter配置到本项目的MainActivity的activity中.

<intent-filter>
            <action android:name="android.intent.action.VIEW" />

            <category android:name="android.intent.category.DEFAULT" />
            <category android:name="android.intent.category.BROWSABLE" />
            <data android:scheme="http" />
            <data android:scheme="https" />
            <data android:scheme="about" />
            <data android:scheme="javascript" />
        </intent-filter>

3.在activity_main.xml中:

 <EditText
        android:id="@+id/browser_et"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

    <WebView 
        android:id="@+id/browser_wv"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

4.在MainActivity中,启用WebView:(查看BrowserActivity.java中搜索 getIntent 得启发)

        EditText et = (EditText) findViewById(R.id.browser_et);
        WebView wv = (WebView) findViewById(R.id.browser_wv);

        Intent intent = getIntent();
        Uri data = intent.getData();
        if(data != null){
            String uri = data.toString();
            et.setText(uri);

            //1.某些网页控件默认不支持js,需手动设置打开
            wv.getSettings().setJavaScriptEnabled(true);
            //2.加载Uri
            wv.loadUrl(uri);
            //3.解决跳转到新界面还需要打开新的浏览器问题,使用当前的即可
            wv.setWebViewClient(new WebViewClient(){
                public boolean shouldOverrideUrlLoading(WebView view, String url) {
                    view.loadUrl(url);
                    //返回true表明告诉系统不要打开新的浏览器,自己处理
                    return true;
                }
            });
        }

5.AndroidManifest.xml中配置网络访问权限:

(2)激活系统短信

Intent intent = new Intent(Intent.ACTION_VIEW);
//系统信息发送界面View,可在创建意图时设置action

intent.setData(Uri.parse("sms:12345"));
intent.putExtra("subject", "大众点评");
intent.putExtra("sms_body", "快点发货,饿死了");

startActivity(intent);

《四:开启新界面,获得新界面的返回值》(设置头像)

1.显式为得到一个结果而开启一个Activity(按钮点击事件,界面一)

    public void chooseIconClick(View v){
        Intent intent = new Intent(this, ChooseIconActivity.class);
        //1为requestCode,标识是哪一个页面会返回结果,对应onActivityResult中的参数
        startActivityForResult(intent, 1);
        }

2.为每一张图片绑定一个点击监听器(界面二)

public class ChooseIconActivity extends Activity implements OnClickListener{
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_choose_icon);


            findViewById(R.id.e0).setOnClickListener(this);
            findViewById(R.id.e1).setOnClickListener(this);
            findViewById(R.id.e2).setOnClickListener(this);
            findViewById(R.id.e3).setOnClickListener(this);
        }
    }

3.根据图片的id判断是哪张图片,将图片的id装入intent中作为result返回至请求界面(界面二)

public void onClick(View arg0) {
        Intent data = new Intent();
        switch (arg0.getId()) {
            case R.id.e0:
                data.putExtra("icon", R.drawable.e0);
                break;
            case R.id.e1:
                data.putExtra("icon", R.drawable.e1);
                break;
            case R.id.e2:
                data.putExtra("icon", R.drawable.e2);
                break;
            case R.id.e3:
                data.putExtra("icon", R.drawable.e3);
                break;

        }
        //resultCode用于标识本页面返回值的类型,可能本页面会有多种类型的值,
        //对应startActivityForResult中的接收动作的参数
        setResult(0, data);
        //必须关闭当前界面才能将意图传出
        finish();
    }

4.使用来自界面二的意图(数据)

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if(data != null){
            //为界面一中的ImageView设置图片
            if(requestCode == 1){
                iconIv.setImageResource(data.getIntExtra("icon", 0));
            }
        }

5.小结:

(1)View.getId():可以得到id.
(2)开启一个Activity有两种形式:需要返回结果和不需要的。前者还需要函数 onActivityResult接收结果。
(3)resultCode在传值时用于标识本页面返回值的类型,requestCode标识是来自哪一个页面返回结果
(4)若要为多个View设置点击事件,采用在本类中事项setOnClickListener,这样只需要写一个函数判断不同的id即可。
(5)界面二的数据要传到界面一中,必须在界面二中调用finish(),不然界面二关闭不了,到不到界面一。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值