码迷,mamicode.com
首页 > 移动开发 > 详细

第九周安卓开发学习总结

时间:2020-04-15 23:01:32      阅读:141      评论:0      收藏:0      [点我收藏+]

标签:config   传值   protect   toast   gets   nullable   des   属性   boa   

写在前面

鸽了很久,在面临要冲刺的大关面前,终于拾了起来。前几周玩的太狠,都忘了正事了。下面开始正式学习。
这几天学习了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"

第九周安卓开发学习总结

标签:config   传值   protect   toast   gets   nullable   des   属性   boa   

原文地址:https://www.cnblogs.com/wushenjiang/p/12709229.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!