Activity的一些知识

今天也是蛮生气的,本来写了一大篇幅的笔记,结果保存草稿完之后博客园崩了一下,全没了,算了,重新写一份吧

首先是关于AndroidManifest.xml的一些介绍

 

 style.xml也需要查一查  设置全局变量的快捷键的ctrl + alt +F 会和qq冲突,注意修改qq的快捷键。 getIntent()不管跳转不跳转,都不会返回空值

 

每个活动对应一个标签,这里注意了,我可以给多个活动设置开机自启动的过滤器,只不过会按照从上往下的顺序进行执行。当声明了两个或者以上的自启动的话,就会生成多个app图标

这里的action的name用来表示系统动作或者是自定义的活动的名字,作为唯一标识。

category标签的name属性,DEFAULT代表默认启动时不会在手机的主页面创建一个图标,而LAUNCHER会生成一个图标
其次label属性可以改名字,icon属性可以改图标,关于矢量图和位图这块的内容需要再进一步学习。设置多个自启动标志的好处是可以方便我们进行测试修改。

其次是有关Intent的用法,之前只知道一个startActivity方法,也就是直接跳转执行,显示的执行

今天看到了一个隐式的用法,可以用以下几种来执行

Intent intent = new Intent();
intent.setAction();
intent.addCategory();
上面的这种,里面传的参数应该和xml配置文件name属性名一致,这里action既可以写在构造方法里面也可以单独写出来

 

 

 Intent intent = new Intent();
        intent.setClassName("com.android.chrome","com.google.android.apps.chrome.Main");
        intent.setPackage();
        intent.setClassName();
        ComponentName componentName = new ComponentName("com.android.chrome","com.google.android.apps.chrome.Main");
     intent.setComponentName(componentName); startActivity(intent);

这里的package和className是诸如浏览器短信之类的类名和包名,隐式意图多用于应用之间的跳转,而显示意图用于应用内部的跳转

后来看了一点有关adb指令相关的东西,首先是把SDK里面的设置环境变量,然后就能使用了

其次下载了grep过滤的一个控件,用来在控制台过滤一部分日志信息,通过shell指令还能完成一些类似于linux的操作。这里我也没学多少,放个网站吧。

https://notes.sunofbeach.net/pages/f5a5ed/

其次通过Intent传递数据,基本数据类型用putExtra(String,Object)即可

自定义类型的话需要实现序列化接口或者使用谷歌的Parcelable接口,然后也是通过putExtra的方法传参。

 

 

 

 再来说一下如何通过Intent模拟短信和拨打号码,拨打号码的代码如下所示:

       Intent intent = new Intent();
        if (ContextCompat.checkSelfPermission(this, Manifest.permission.CALL_PHONE)== PackageManager.PERMISSION_GRANTED) {
            intent.setAction(Intent.ACTION_CALL);//有权限则直接ACTION_CALL
            intent.setData(Uri.parse("tel:10086"));
            startActivity(intent);
        }else{
            ActivityCompat.requestPermissions(this,new String []{Manifest.permission.CALL_PHONE},1);//无权限则询问开启权限
            intent.setAction(Intent.ACTION_CALL);
            intent.setData(Uri.parse("tel:10086"));
            startActivity(intent);
        }

这里需要在xml里面写上权限,在6.0之后都是动态获取权限了,也就是上面的代码所示

<uses-permission android:name="android.permission.CALL_PHONE" />

其次要说明uri这个对象的tel:这个是前缀,必须要这么写,在xml里面的表示就是

<data android:scheme="tel"/>data标签也是写在intent-filter标签里面的,data标签的引用使得隐式意图多了一个限制的条件,也可以通过

intent.setData("uri.parse("tel:10086") 和intent.getData()来获取到uri的内容

模拟短信同理,这里就之间放代码了。

 

 

 

 

 

 

 

 

 然后简单说一下intent来实现数据的回传

首先需要startActivityForResult(intent,int 这里第二个参数是请求码,用来执行onActivityResult方法用的)传一个intent ,在另一个Activity中获取到intent内容之后,再new一个intent 

最后setResult("第一个参数是响应码“,intent); finish();

后来通过intent调用系统相机并返回至页面,用到位图和数据回传,具体代码如下:

  iv_show = findViewById(R.id.iv_show);
        iv_take = findViewById(R.id.iv_take);
        iv_take.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent();
                intent.setAction("android.media.action.IMAGE_CAPTURE");
                intent.addCategory(Intent.CATEGORY_DEFAULT);
                startActivityForResult(intent,1);
            }
        });
   @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {

        super.onActivityResult(requestCode, resultCode, data);
        if(requestCode==1&&resultCode== Activity.RESULT_OK&&data!=null){

            Bitmap resultMap = data.getParcelableExtra("data");
            iv_show.setImageBitmap(resultMap);

        }else if(requestCode==1&&resultCode==Activity.RESULT_CANCELED){
            Toast.makeText(this, "您取消了拍照", Toast.LENGTH_SHORT).show();
        }
    }

 

最后了解了一下Activity的生命周期,之前我只知道onCreate onStart onResume onPause onStop onDestory的执行流程

没想到我们也可以在这六个方法里面执行一些逻辑代码,对于onCreate和onDestory来说,他们是相对了,这里举个小例子,如果我们填写一个数据,然后再次打开的时候还想看到之前填写的数据,我们可以在onDestory方法里面通过共享参数来持久化保存我们的数据,当再次onCreate的时候,先判断,如果不为null,就把共享参数的数据回传给EditText等等。

onStart和onStop方法是相对的。这里可以拿看电影的时候突然来了电话作为例子,来了电话就会执行onStop方法,我们可以在这个方法里面书写让电影暂停播放的代码

然后打完电话之后接着执行onStart方法,再执行其他的操作。

onStart方法执行完之后其实就可以看到页面了,onResume方法在onStart的基础上可以获取焦点了。

onResume方法用于获取焦点,onPause用于失去焦点,当我们从第一个活动跳转至第二个活动时

如果第二个活动的主题设置为透明的话,就仍能看到第一个活动,这个时候第一个活动只执行onPause方法也就是失去焦点,不会执行onStop方法。

 

 上图就是设置主题为透明。

横竖屏切换会执行onDestory方法然后再次执行onCreate onStart onResume的方法

了解到了findViewById获取到控件之后,调用post()方法传参是一个实现Runnable接口的实现对象,重写run方法,里面的代码是在主线程执行的,执行时机是在AttachToWindow之后执行的。

当我们打游戏看视频的时候横竖屏切换如果重新执行onCreate方法的话显然是不能给用户体验的。

以下给出两种解决方式

第一种,强制只能竖屏或者横屏,比如王者荣耀等手游。

 

 给screenOrientation设置为横屏。

 

 第二种解决方案就是如上图所示:configChanges给他添加这三个属性。

 


同时Activity有个launchMode属性,用来设置任务栈的不同方式

第一种也是默认的模式 launchMode = "standard"

第二种模式是launchMode = "singleTop"模式,如果当前活动处于栈顶,则不会重复创建该活动。

 

posted @ 2023-03-08 22:03  -她的梦-  阅读(262)  评论(0编辑  收藏  举报