安卓基础-day06-20180131

多个界面应用程序开发
  • 在清单文件中配置
  • 在代码中实现onCreate()-->setContentView();
  • 一个程序可以有多个界面,在桌面上可以有多个快捷图标.

清单文件中配置以下内容,即有多个启动入口

<intent-filter>
 <action android:name="android.intent.action.MAIN" />
 <category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
界面跳转

Intent 可以用于activity传递数据

  • 传递页面:MainActivity
                Intent intent = new Intent(MainActivity.this, Main2Activity.class);
                //传递数据
                //string类型的
                intent.putExtra("string", textView.getText().toString());
                //图片类型的
                intent.putExtra("image", BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher));
                startActivity(intent);
  • 接受数据页面 Main2Activity
        //得到传递的数据
        Intent intent = getIntent();
        //接受字符串
        String text = intent.getStringExtra("string");
        //接受图片
        Bitmap image = intent.getParcelableExtra("image");

        textView.setText(text);
        imageView.setImageBitmap(image);
显式意图 & 隐式意图
  • 显式意图

必须要指定被开启的Activity的类名或者路径名称 激活自己应用程序的内部组建,推荐使用显式意图,效率高

  • 开启自己应用程序内的页面
Intent intent = new Intent(MainActivity.this, Main1Activity.class);
startActivity(intent);
  • 隐式意图

只需要指定action(动作)和data(数据)就可以 激活别的应用程序的界面,或者是自己应用程序的某个界面需要暴露给别的应用程序调用.效率低.

  • 开启自己应用程序内的页面(实际开发并不会这样使用,只是用于对比代码写出)
        Intent intent = new Intent();
        intent.setAction("com.example.yuewang.basicandroidday06.open2");
        intent.addCategory("android.intent.category.DEFAULT");
        startActivity(intent);
  • 开启外部应用程序内的页面
        Intent intent = new Intent();
        //action的内容与下面在清单文件中配置的相同
        intent.setAction("com.example.myapplication.Main3Activity");
        intent.addCategory("android.intent.category.DEFAULT");
        startActivity(intent);

还需要在(Main3Activity)清单文件中配置

        <activity android:name=".Main3Activity">
            <intent-filter>
                <action android:name="com.example.myapplication.Main3Activity" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </activity>
隐式意图的详细参数

intent.setType();和intent.setData();不能同时是使用,因为任意一个会清除前面一个设置的属性值,因此要想同事设置这两个值,可以使用setDataAndType()设置!

  • 需要注意的细节
  1. 当隐式意图配置了多个data标签的时候,代码编写的时候至少要配置一个!,如果多配置了,最后的会覆盖前面的
  1. 如果别人的隐式activity有多个Category的时候,尽量都写全,不要漏写
  1. 记住在清单文件中配置隐式activity的时候,一定要配置默认的category( <category android:name="android.intent.category.DEFAULT"/> ) 因为在代码中,就算不显示的去调用addCategory(),系统也会默认的给我们加上一个DEFALUT值的category,这个时候如果要打开的activity清单 文件中没有配置默认的category就会出错了!
  1. 发现隐式意图有多个action的时候,只需要配置一个就可以了。
使用Intent传递数据

三步:

  1. 告诉即将要打开的页面,你需要你返回的数据 --startActivityForResult(intent, 1);
  2. 使用setResult()返回请求的数据,并且设置对应的key --setResult(2, intent);
  3. 接受返回的数据 --onActivityResult
  • 具体代码:
        //1.告诉即将要打开的页面,你需要你返回的数据
        Intent intent = new Intent(this, SmsListActivity.class);
        startActivityForResult(intent, 1);
        //2.使用setResult()返回请求的数据,并且设置对应的key
        Intent intent = new Intent();
        String contact = ContactListActivity.this.contact[position];
        intent.putExtra("contact", contact);
        setResult(2, intent);
        finish();
        //3.接受返回的数据
        @Override
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {
            super.onActivityResult(requestCode, resultCode, data);
            //3.接受返回的数据,通过设置的resultCode区分是谁返回的数据
            if (requestCode == 1) {
                if (data != null) {
                    String messageText = data.getStringExtra("message");
                    content.setText(messageText);
    
    
                }
            } else if (requestCode == 2) {
                if (data != null) {
                    String contactText = data.getStringExtra("contact");
                    contact.setText(contactText);
                }
            }
        }
Activity的生命周期

onCreate()-->(onRestart())-->onStart()-->onResume()-->onPause()-->onStop()-->onDestory().

onCreate()--Activity创建时调用的方法 
onDestory()--Activity销毁时调用的方法 
onStart()--Activity页面可见时调用的方法
onStop()--Activity页面不可见时调用的方法
onResume()--Activity页面获取焦点时调用的方法
(案例中是在页面上开启一个透明的activity
,之前的页面虽然可见,但是失去焦点了.可以在清单文件中设置主题
android:theme="@android:style/Theme.Translucent.NoTitleBar")
onPause()--Activity页面失去焦点时调用的方法
onRestart()--onStop()onstart()时之前经历的一个方法
  • 横竖屏切换时的生命周期

横竖屏切换时默认回销毁当前activity,然后在重新开启,因此可以设置以下属性,这样activiy就不会因为切换横竖屏而销毁activity.

//设置屏幕的固定朝向
android:screenOrientation="landscape"(或者portrait)
//或者设置屏幕变化属性
android:configChanges="keyboardHidden|screenSize|orientation"
Activity的启动模式(android:launchMode="")
  • standard:标准启动模式

    默认场景,每次都会开启新的activity

  • singleTop:单一顶部模式

    如果activity已经开启,且位于栈顶,则不会开启新的activity,而是复用这个已经开启的activity,为了方式出现一些奇怪的用户体验,推荐使用这个模式,整个任务栈中可以允许有多个实例存在,只是检查栈顶是否是当前实例.

    应用场景:短信发送

  • singleTask:单一任务栈

    在整个任务战中之允许有一个当前的activity存在,如果要开启的activity已经存在,那么直接复用已经开启的,并且会把这个栈上当前activity上面其他的activity给清空.

    应用场景:如果一个activity非常消耗内存建议把这个activity设置成singleTask模式. 浏览器

  • singleInstant:单一实例

    整个手机系统中只有一个实例存在,且运行在单独的任务栈里面.

    应用场景:通话界面的activity

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值