核心内容摘要
收藏!5步高效搭建AI智能体,小白也能轻松搞定,提升效率必备!
4.
1 Activity初学乍练分类Android 基础入门教程本节引言本节开始讲解Android的四大组件之一的Activity(活动)先来看下官方对于Activity的介绍 PS:官网文档Activity介绍如下大概意思Activity是一个应用程序的组件他在屏幕上提供了一个区域允许用户在上面做一些交互性的操作 比如打电话照相发送邮件或者显示一个地图Activity可以理解成一个绘制用户界面的窗口 而这个窗口可以填满整个屏幕也可能比屏幕小或者浮动在其他窗口的上方从上面这段话我们可以得到以下信息
Activity用于显示用户界面用户通过Activity交互完成相关操作
一个App允许有多个Activity好了大概的引言就介绍到这里想深入了解可以继续看API开始本节内容~
Activity的概念与Activity的生命周期图
注意事项
onPause()和onStop()被调用的前提是 打开了一个新的Activity而前者是旧Activity还可见的状态后者是旧Activity已经不可见
另外亲测AlertDialog和PopWindow是不会触发上述两个回调方法的~
Activity/ActionBarActivity/AppCompatActivity的区别在开始讲解创建Activity之前要说下这三个的一个区别 Activity就不用说啦后面这两个都是为了低版本兼容而提出的提出来的他们都在v7包下 ActionBarActivity已被废弃从名字就知道ActionBar~而在
0后被Google弃用了现在用 ToolBar...而我们现在在Android Studio创建一个Activity默认继承的会是AppCompatActivity! 当然你也可以只写Activity不过AppCompatActivity给我们提供了一些新的东西而已 两个选一个Just you like~
Activity的创建流程PS:好了上面也说过可以继承Activity和AppCompatActivity只不过后者提供了一些新的东西而已 另外切记Android中的四大组件只要你定义了无论你用没用都要在AndroidManifest.xml对 这个组件进行声明不然运行时程序会直接退出报ClassNotFindException...
onCreate()一个参数和两个参数的区别相信用as的朋友在重写Act的onCreate()方法时会发现这玩意有两个参数可是正常的才只有一个参数啊恩呢这就是
0给我们提供的新的方法要用它先要在配置文件中为我们的Activity设置一个属性android:persistableModepersistAcrossReboots然后我们的Activity就拥有了持久化的能力了一般我们会搭配另外两个方法来使用public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState) public void onRestoreInstanceState(Bundle savedInstanceState, PersistableBundle persistentState)相信有些朋友对这两个方法名不陌生吧前一个方法会在下述情形中被调用点击home键回到主页或长按后选择运行其他程序按下电源键关闭屏幕启动新的Activity横竖屏切换时肯定会执行因为横竖屏切换的时候会先销毁Act然后再重新创建 重要原则当系统未经你许可时销毁了你的activity则onSaveInstanceState会被系统调用 这是系统的责任因为它必须要提供一个机会让你保存你的数据你可以保存也可以不保存。
而后一个方法和onCreate同样可以从取出前者保存的数据 一般是在onStart()和onResume()之间执行 之所以有两个可以获取到保存数据的方法是为了避免Act跳转而没有关闭 然后不走onCreate()方法而你又想取出保存数据~说回来说回这个Activity拥有了持久化的能力增加的这个PersistableBundle参数令这些方法 拥有了系统关机后重启的数据恢复能力而且不影响我们其他的序列化操作卧槽 具体怎么实现的暂时还不了解可能是另外弄了个文件保存吧~后面知道原理的话会告知下大家 另外API版本需要21就是要
0以上的版本才有效~
启动一个Activity的几种方式在Android中我们可以通过下面两种方式来启动一个新的Activity,注意这里是怎么启动而非 启动模式分为显示启动和隐式启动
显式启动通过包名来启动写法如下①最常见的startActivity(new Intent(当前Act.this,要启动的Act.class));②通过Intent的ComponentNameComponentName cn new ComponentName(当前Act的全限定类名,启动Act的全限定类名) ; Intent intent new Intent() ; intent.setComponent(cn) ; startActivity(intent) ;③初始化Intent时指定包名Intent intent new Intent(android.intent.action.MAIN); intent.setClassName(当前Act的全限定类名,启动Act的全限定类名); startActivity(intent);
隐式启动通过Intent-filter的Action,Category或data来实现 这个是通过Intent的intent-filter**来实现的这个Intent那章会详细讲解 这里知道个大概就可以了
另外还有一个直接通过包名启动apk的Intent intent getPackageManager().getLaunchIntentForPackage (apk第一个启动的Activity的全限定类名) ; if(intent ! null) startActivity(intent) ;
横竖屏切换与状态保存的问题前面也也说到了App横竖屏切换的时候会销毁当前的Activity然后重新创建一个你可以自行在生命周期 的每个方法里都添加打印Log的语句来进行判断又或者设一个按钮一个TextView点击按钮后修改TextView 文本然后横竖屏切换会神奇的发现TextView文本变回之前的内容了 横竖屏切换时Act走下述生命周期onPause- onStop- onDestory- onCreate-onStart-onResume关于横竖屏切换可能遇到下述问题
先说下如何禁止屏幕横竖屏自动切换吧很简单在AndroidManifest.xml中为Act添加一个属性android:screenOrientation 有下述可选值unspecified:默认值 由系统来判断显示方向.判定的策略是和设备相关的所以不同的设备会有不同的显示方向。
landscape:横屏显示宽比高要长portrait:竖屏显示(高比宽要长)user:用户当前首选的方向behind:和该Activity下面的那个Activity的方向一致(在Activity堆栈中的)sensor:有物理的感应器来决定。
如果用户旋转设备这屏幕会横竖屏切换。
nosensor:忽略物理感应器这样就不会随着用户旋转设备而更改了unspecified设置除外。
横竖屏时想加载不同的布局1准备两套不同的布局Android会自己根据横竖屏加载不同布局 创建两个布局文件夹layout-land横屏,layout-port竖屏 然后把这两套布局文件丢这两文件夹里文件名一样Android就会自行判断然后加载相应布局了2 )自己在代码中进行判断自己想加载什么就加载什么我们一般是在onCreate()方法中加载布局文件的我们可以在这里对横竖屏的状态做下判断关键代码如下if (this.getResources().getConfiguration().orientation Configuration.ORIENTATION_LANDSCAPE){ setContentView(R.layout.横屏); } else if (this.getResources().getConfiguration().orientation Configuration.ORIENTATION_PORTRAIT) { setContentView(R.layout.竖屏); }
如何让模拟器横竖屏切换如果你的模拟器是GM的话。
直接按模拟器上的切换按钮即可原生模拟器可按ctrl f11/f12切换
状态保存问题这个上面也说过了通过一个Bundle savedInstanceState参数即可完成 三个核心方法onCreate(Bundle savedInstanceState); onSaveInstanceState(Bundle outState); onRestoreInstanceState(Bundle savedInstanceState);你只重写onSaveInstanceState()方法往这个bundle中写入数据比如outState.putInt(num,
;这样然后你在onCreate或者onRestoreInstanceState中就可以拿出里面存储的数据不过拿之前要判断下是否为null哦savedInstanceState.getInt(num);然后想干嘛就干嘛~
系统给我们提供的常见的Activity好的最后给大家附上一些系统给我们提供的一些常见的Activtiy吧//
拨打电话 // 给移动客服10086拨打电话 Uri uri Uri.parse(tel:
; Intent intent new Intent(Intent.ACTION_DIAL, uri); startActivity(intent); //
发送短信 // 给10086发送内容为“Hello”的短信 Uri uri Uri.parse(smsto:
; Intent intent new Intent(Intent.ACTION_SENDTO, uri); intent.putExtra(sms_body, Hello); startActivity(intent); //
发送彩信相当于发送带附件的短信 Intent intent new Intent(Intent.ACTION_SEND); intent.putExtra(sms_body, Hello); Uri uri Uri.parse(content://media/external/images/media/
; intent.putExtra(Intent.EXTRA_STREAM, uri); intent.setType(image/png); startActivity(intent); //
打开浏览器: // 打开Google主页 Uri uri Uri.parse(http://www.baidu.com); Intent intent new Intent(Intent.ACTION_VIEW, uri); startActivity(intent); //
发送电子邮件:(阉割了Google服务的没戏!!!!) // 给someonedomain.com发邮件 Uri uri Uri.parse(mailto:someonedomain.com); Intent intent new Intent(Intent.ACTION_SENDTO, uri); startActivity(intent); // 给someonedomain.com发邮件发送内容为“Hello”的邮件 Intent intent new Intent(Intent.ACTION_SEND); intent.putExtra(Intent.EXTRA_EMAIL, someonedomain.com); intent.putExtra(Intent.EXTRA_SUBJECT, Subject); intent.putExtra(Intent.EXTRA_TEXT, Hello); intent.setType(text/plain); startActivity(intent); // 给多人发邮件 Intent intentnew Intent(Intent.ACTION_SEND); String[] tos {1abc.com, 2abc.com}; // 收件人 String[] ccs {3abc.com, 4abc.com}; // 抄送 String[] bccs {5abc.com, 6abc.com}; // 密送 intent.putExtra(Intent.EXTRA_EMAIL, tos); intent.putExtra(Intent.EXTRA_CC, ccs); intent.putExtra(Intent.EXTRA_BCC, bccs); intent.putExtra(Intent.EXTRA_SUBJECT, Subject); intent.putExtra(Intent.EXTRA_TEXT, Hello); intent.setType(message/rfc
; startActivity(intent); //
显示地图: // 打开Google地图中国北京位置北纬
3
9东经
1
3 Uri uri Uri.parse(geo:
3
9,
116.
; Intent intent new Intent(Intent.ACTION_VIEW, uri); startActivity(intent); //
路径规划 // 路径规划从北京某地北纬
3
9东经
1
3到上海某地北纬
3
2东经
1
4 Uri uri Uri.parse(http://maps.google.com/maps?fdsaddr
3
9
1
3daddr
3
2
121.