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

来源:互联网 发布:手机淘宝详情店铺活动 编辑:程序博客网 时间:2024/05/16 19:06

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

//想打开的页面需要在创建意图时显式指定要打开那个ActivityIntent 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和typestartActivity(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,可在创建意图时设置actionintent.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 0
原创粉丝点击