• 第九周安卓开发学习总结(1)


    写在前面

    鸽了很久,在面临要冲刺的大关面前,终于拾了起来。前几周玩的太狠,都忘了正事了。下面开始正式学习。
    这几天学习了Activity的相关内容。是安卓四大组件之一,可以说是最根本的东西了。

    了解AndroidManifest.xml

    这个文件的存在是为了描述我们的项目文件,我们四大组件都需要在清单文件里进行注册才能正常使用。如图:

    application就是APP的全称,代表我们的整个app项目。我们可以在里面设置APP的图标,名字等等属性。
    下面就是activity的注册声明了。里面包含了意图过滤,用来设置应用的启动入口等等

    实现界面跳转

    显式意图应用内Activity跳转

    实现很简单,如下代码:

                    //显式启动的第一种写法
                    Intent intent = new Intent();
                   intent.setClass(MainActivity.this,SecondActivity.class);
                    startActivity(intent);
    
                    //显式启动的第二种写法
                   Intent intent1 = new Intent();
                   intent1.setClassName(MainActivity.this,"com.test.activitiyleanring.SecondActivity");
                   startActivity(intent1);
    
                    //显式启动的第三种写法
                   Intent intent = new Intent();
                   ComponentName componentName = new ComponentName(MainActivity.this,SecondActivity.class);
                  intent.setComponent(componentName);
                 startActivity(intent);
    

    其实,一般情况下我们都这么写(最多的使用方式):

    Intent intent = new Intent(this,SecondActivity.classs);
    startActivity(intent);
    

    隐式意图应用内Activity跳转

                    //隐式启动的第一种写法
                    Intent intent = new Intent("abcd.SecondActivity");
                    startActivity(intent);
                    //隐式启动的第二种写法
                    Intent intent = new Intent();
                    intent.setAction("abcd.SecondActivity");
                    startActivity(intent);
    

    所谓的隐式意图,其实就是不明确点出我要去启动哪个activity,而从activity的目录读取。

    显式意图和隐式意图的用途?

    说了这么多,我也很疑惑,隐式意图这么麻烦,为什么要用他呢?其实是为了启动第三方应用(如调用手机相机等等。)
    那么我们来看一下如何通过显式和隐式启动第三方应用:

    显式意图启动第三方应用

        /**
         * 这个方法会在点击按钮的时候执行
         *
         * @param view 这个其实是我们点击的button
         *             <p>
         *             其实组件的名称 ComponentName = 包名/类得路径名称,如果类和前面的包名一样就可以省略成.
         *             <p>
         *             以下这种方式是显式意图跳转到浏览器界面
         */
        public void skip2BrowserVisible(View view) {
            Log.d(TAG, "skip2Browser");
            Intent intent = new Intent();
            //第一种写法
            //intent.setClassName("com.android.chrome","com.android.browser.BrowserActivity");
            //第二种写法
            ComponentName componentName = new ComponentName("com.android.chrome", "com.android.browser.BrowserActivity");
            intent.setComponent(componentName);
            startActivity(intent);
        }
    

    可以看到,我们还要找到包名等等,十分麻烦。
    那隐式启动呢?

    隐式意图启动第三方应用

       /**
         * 下面我们通过隐式意图跳转到浏览器界面
         * 步骤:
         * 1.创建Intent对象
         * 2.给Intent对象设置Action值,设置它的category值,如果5.1以上系统需要设置包名
         * 3.startActivity来跳转到另外一个界面
         *
         * @param v
         */
        public void skip2BrowserInvisible(View v) {
            Intent intent = new Intent();
    //        <intent-filter>
    //        <action android:name="android.intent.action.SEARCH" />
    //        <category android:name="android.intent.category.DEFAULT" />
    //        </intent-filter>
            intent.setAction("android.intent.action.SEARCH");
            intent.addCategory("android.intent.category.DEFAULT");
            intent.setPackage("com.android.browser");
            startActivity(intent);
        }
    

    可以看到,隐式启动比较简单。这也是为什么隐式启动会常用于第三方应用的启动。

    实现界面跳转传值

    传值

    先看代码:

        private void initListener() {
            mLogin.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    //这里面也就是登陆按钮被点击了
                    Log.d(TAG,"login被点击了");
                    handlerLogin();
                }
            });
        }
    
        private void handlerLogin() {
            String accountText = mAccount.getText().toString().trim();
            if (TextUtils.isEmpty(accountText)) {
                Toast.makeText(this,"输入的账号为空!",Toast.LENGTH_SHORT).show();
                return;
            }
            String passwordText = mPassword.getText().toString().trim();
            if (TextUtils.isEmpty(passwordText)) {
                Toast.makeText(this,"输入的密码为空!",Toast.LENGTH_SHORT).show();
                return;
            }
            //有密码有账号以后,我们把数据传到另外一个界面
            //先要创建一个意图对象,然后通过startActivity方法来跳转
            /**
             * 这部分是用于显式意图跳转到另外一个Activity
             */
            //Intent intent = new Intent(this,SecondActivity.class);
            Intent intent = new Intent();
            String packageName = this.getPackageName();
            String  targetActivityClsName = SecondActivity.class.getName();
            intent.setClassName(packageName,targetActivityClsName);
            Log.d(TAG,"packageName "+packageName);
            Log.d(TAG,"className "+ targetActivityClsName);
    
            intent.putExtra("account",accountText);
            intent.putExtra("password",passwordText);
            startActivity(intent);
    

    可以看到,我们用putExtra方法来放入值,然后我们再在第二个界面接收:

    public class SecondActivity extends Activity {
        private static final String TAG = "SecondActivity";
        @Override
        protected void onCreate( Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_second);
            TextView info = this.findViewById(R.id.info);
            Intent intent = getIntent();
            String account = intent.getStringExtra("account");
            String password = intent.getStringExtra("password");
            Log.d(TAG,"account =="+account);
            Log.d(TAG,"password =="+password);
            info.setText("您的账号是:"+account+"  密码是:"+password);
    
        }
    }
    

    同样的,对象等等也是可以传的,但要对用户类实现序列化才可(implements Parcelable),之后使用putExtra方法就可

    回调

                    Intent intent = new Intent(MainActivity.this,PayActivity.class);
                    //第一步,使用startActivityForResult代替原来的startActivity
                    startActivityForResult(intent,PAY_REQUEST_CODE);
        /**
         * 返回的结果会在这里回调
         * @param requestCode
         * @param resultCode
         * @param data
         */
        @Override
        protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
            super.onActivityResult(requestCode, resultCode, data);
            if (requestCode == PAY_REQUEST_CODE) {
                String resultContent = null;
                if (resultCode == 2) {
                    //充值成功
                    resultContent = data.getStringExtra("resultContent");
                }else if(resultCode ==3){
                    //充值失败
                    resultContent = data.getStringExtra("resultContent");
                }
                mPayResultText.setText(resultContent);
            }
        }
    

    回调要麻烦一些,首先要使用startActivityForResult方法,然后再复写onActivityResult方法就可以取得回调的参数了

    Activity的生命周期

    之前也了解过,分别是onCreate onStart onResume onPause onStop onDestroy 生命周期按顺序走动。其中我们一般在onDestroy方法存储数据,然后在onCreate方法再复原出来。

    横竖屏对Activity生命周期的影响

    横竖屏会让Activity销毁再启动,就会使得开发时遇到一些困难,这时我们一可以固定住,二可以配置:

    android:configChanges="keyboardHidden|screenSize|orientation"
    
  • 相关阅读:
    Qt之表单布局(QFormLayout)
    Qt之格栅布局(QGridLayout)
    Qt之水平/垂直布局(QBoxLayout、QHBoxLayout、QVBoxLayout)
    Qt之手动布局
    MAC OS下JDK版本切换指南
    Qt之自定义布局管理器(QBorderLayout)
    Qt之自定义布局管理器(QFlowLayout)
    Qt之自定义布局管理器(QCardLayout)
    springMVC获取file,几种转换
    java将白色背景图片转换成无色
  • 原文地址:https://www.cnblogs.com/wushenjiang/p/12709229.html
Copyright © 2020-2023  润新知