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"模式,如果当前活动处于栈顶,则不会重复创建该活动。