Android开发
相关概念
安卓开发中JDK、SDK、NDK、ADT、ANT等概念作用解释
开发
(收集整理Android开发所需的Android SDK、开发中用到的工具、Android开发教程、Android设计规范,免费的设计素材等)
Android中API级别
清单文件中
<uses-sdk android:minSdkVersion="integer" android:targetSdkVersion="integer" android:maxSdkVersion="integer" />
通过整数形式的 API 级别表示应用与一个或多个版本的 Android 平台的兼容性。应用表示的 API 级别将与给定 Android 系统的 API 级别进行比较,其结果在不同 Android 设备上可能有所差异。
- android:minSdkVersion
一个用于指定应用运行所需最低 API 级别的整数。如果设备的 API 级别低于该属性中指定的值,Android 系统将阻止用户安装应用。您应始终声明该属性。
注意:如果您不声明该属性,系统将假定默认值为“1”,这表示您的应用兼容所有 Android 版本。如果您的应用并不兼容所有版本(例如,它使用 API 级别 3 中引入的 API),并且您尚未声明正确的 minSdkVersion
,则当应用安装在 API 级别小于 3 的系统上时,应用将在运行时尝试访问不可用的 API 时发生崩溃。因此,请务必在 minSdkVersion
属性中声明合适的 API 级别。
android:targetSdkVersion
一个用于指定应用的目标 API 级别的整数。如果未设置,其默认值与为 minSdkVersion
指定的值相等。
该属性用于通知系统,您已针对目标版本进行测试,并且系统不应通过启用任何兼容性行为,以保持您的应用与目标版本的向前兼容性。应用仍可在较低版本上运行(最低版本为 minSdkVersion
)。
android:maxSdkVersion
一个指定作为应用设计运行目标的最高 API 级别的整数。
任一情况下,如果应用的 maxSdkVersion
属性低于系统本身使用的 API 级别,则系统将不允许安装应用。在系统更新后重新验证的情况下,这实际相当于将您的应用从设备中移除。
警告:不建议声明该属性。
API级别,各 Android 平台版本所支持的 API 级别,参考官网:什么是 API 级别?
Android 平台提供一种框架 API,应用可利用它与底层 Android 系统进行交互。该框架 API 由以下部分组成:
- 一组核心软件包和类
- 一组用于声明清单文件的 XML 元素和属性
- 一组用于声明和访问资源的 XML 元素和属性
- 一组 Intent
- 一组应用可请求的权限,以及系统中包括的权限强制执行
Android 平台提供的框架 API 使用称为“API 级别”的整数标识符指定。每个 Android 平台版本恰好支持一个 API 级别,但隐含对所有早期 API 级别(低至 API 级别 1)的支持。Android 平台初始版本提供的是 API 级别 1,后续版本的 API 级别则依次增加。
match_parent、fill_parent与wrap_content的区别
/match_parent/: 它就是强制性的使它的大小等同于父控件,父控件多大,他就多大。
/fill_parent/: 这个属性就是充满了整个父控件。
有的人可能会觉得fill_parent和match_parent的作用相同啊。没错,从Android2.2以后是一样的,但是如果为了兼容更低的版本,建议使用fill_parent。
蓝色框框是父控件的大小—-(fill_parent,match_parent)
/wrap_content/: wrap—->包(着),content—->内容,单词意思上去理解,这个属性就是让这个属性包着内容,转译过来,就是使这个属性和内容的大小刚好。
蓝色框框是父控件大小—-(wrap_content)
View中FocusChange与Click的区别
以编辑栏为例,
FocusChange是焦点切换事件,当焦点不在此控件时,一旦它获得焦点则引发该事件;相反 失去焦点也会触发
_etFrom.FocusChange += EtSender_FocusChange; private void EtSender_FocusChange(object sender, FocusChangeEventArgs e) { if (e.HasFocus) { if (_pageViewPcl.MailAccountList.Count > 1) { SwitchAccount(); } } }
Click时单击事件(前提是此控件获得焦点的情况下,否则不会触发)
Activity的生命周期
Android程序关闭 退出问题
在Xamarin.Android中是System.Environment.Exit(0)
1、使用System.exit(0)退出后app又重新启动
System.exit(0):终止当前正在运行的 Java 虚拟机。参数用作状态码;根据惯例,非 0 的状态码表示异常终止。System.exit(0)正常终止程序,有时候在退出安卓应用会使用到。
使用这个方法如果前面存在没有finish()掉的Activity会重新启动,导致退出失败。
所以:使用System.exit(0)时,确保任务栈中所有activity已经finish。
2、Process.killProcess(Process.myPid())
会杀掉所有PID一样的进程,比如那些拥有相同UID的应用,统统都会被杀掉。
但是这两种都需要注意 所有Activity都已经销毁。
参考:
Android两种杀掉进程方式总结(System.exit()和Process.killProcess())
System.exit和Process.killProcess
3、关闭Activity
- finish ()方法:在你的activity结束或者应该被关闭时调用。ActivityResult将通过onActivityResult()方法传递给启动者。这是比较常用的关闭Activity的方法。
- finishAffinity()方法:关闭该Activity和同一栈中的所有位于该Activity下面的Activity。比如说在同一Activity栈中,Activity A启动了Activity B,Activity B启动了Activity C。Activity B调用finishAffinity()方法,会关闭 Activity A和 Activity B,Activity C仍然存在。如果Activity C调用该方法,则A,B,C,都会被关闭,且如果应用只有这一个栈,那么C调用该方法会直接退出应用。注意:该方法在API level 16之后添加。
-
finishAndRemoveTask()方法:系统默认情况下finish、killProcess,应用窗口缩略图依然会保留在最近任务中。 此方法让Activity不显示在系统的最近任务列表中,按了HOME键之后,Activity是完全不显示在最近任务中,即使它还在运行。
Android 判断锁屏,亮屏,解锁
广播接收器BroadcastReceiver,有点类似发布订阅。它监听的是设备的事件,当前app在后台运行时,也能监测到这些事件。
按锁屏按键是ActionScreenOff 此时锁屏,熄屏;
解锁与亮屏:
实际测试中发现,
1、输入密码/指纹时开启,可能时,解锁->亮屏【黑屏时指纹】 或者 亮屏->解锁【先亮着屏再解锁】
2、人脸识别开启,也可能时,解锁->亮屏【黑屏时对着人脸】 或者 亮屏->解锁【先亮着屏再对着人脸】
参考:
但是需要注意:注销(防止资源泄露)
【官方】Broadcast Receivers in Xamarin.Android
//定义 public class LockScreenReceiver : BroadcastReceiver { public string ChangeRemark = ""; public override void OnReceive(Context context, Intent intent) { if (intent != null) { if (intent.Action.Equals(Intent.ActionScreenOn)) { ChangeRemark = "亮屏"; } else if (intent.Action.Equals(Intent.ActionScreenOff)) { ChangeRemark = "锁屏"; } else if (intent.Action.Equals(Intent.ActionUserPresent)) { ChangeRemark = "解锁"; } //MainApplication.getInstance().setChangeDesc(change); } } } //使用 public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity { private LockScreenReceiver mReceiver; private IntentFilter filter; protected override void OnCreate(Bundle bundle) { base.OnCreate(bundle); global::Xamarin.Forms.Forms.Init(this, bundle); mReceiver = new LockScreenReceiver(); filter = new IntentFilter(); filter.AddAction(Intent.ActionScreenOn); filter.AddAction(Intent.ActionScreenOff); filter.AddAction(Intent.ActionUserPresent); RegisterReceiver(mReceiver, filter); LoadApplication(new App()); } protected override void OnDestroy() { base.OnDestroy(); if (mReceiver != null) UnregisterReceiver(mReceiver); } protected override void OnResume() { if (mReceiver.ChangeRemark == "亮屏") { } } }
Android数据存储
Android 五种数据存储的方式分别为:
1. SharedPreferences:以Map形式存放简单的配置参数;
2. ContentProvider:将应用的私有数据提供给其他应用使用;
3. 文件存储:以IO流形式存放,可分为手机内部和手机外部(sd卡等)存储,可存放较大数据;
4. SQLite:轻量级、跨平台数据库,将所有数据都是存放在手机上的单一文件内,占用内存小;
5. 网络存储 :数据存储在服务器上,通过连接网络获取数据;
Sharedpreferences是Android平台上一个轻量级的存储类,用来保存应用程序的各种配置信息,其本质是一个以“键-值”对的方式保存数据的xml文件,其文件保存在/data/data//shared_prefs目录下。在应用中通常做一些简单数据的持久化缓存。
在全局变量上看,其优点是不会产生Application 、 静态变量的OOM(out of memory)和空指针问题,其缺点是效率没有上面的两种方法高。
参考:Android数据存储五种方式总结