一文学习 Android 原生开发 - daidaidaiyu

一文学习 Android 原生开发 - daidaidaiyu

组件是一个Android程序至关重要的构建模块.每一个组件都是系统进入你的应用的不同途径.但并不是所有的组件都是用户进入程序的真实入口, 其中一些要依赖于其它组件, 但是每一个组件都以自己独有的形式存在, 并发挥特殊的作用; 每一个组件都是一个唯一的模块, 帮助你实现程序的各种行为. 科技新闻。

以下是三种不同的服务类型:

启用

id背景与起因

子控件常用属性: 属性 说明 android:layout_column 第几列 android:layout_span 占据列数

您也可创建线性布局,让子元素使用大小不同的屏幕空间:

内容提供程序有助于应用管理其自身和其他应用所存储数据的访问,并提供与其他应用共享数据的方法。它们会封装数据,并提供用于定义数据安全性的机制。内容提供程序是一种标准接口,可将一个进程中的数据与另一个进程中运行的代码进行连。实现内容提供程序大有好处。最紧要的是,通过配置内容提供程序,您可以使其他应用安全地访问和修改您的应用数据

id事件经过

您可以将多个客户端同时连接到某项服务。但是,系统会缓存 IBinder 服务通信通道。换句话说,只有在第一个客户端绑定时,系统才会调用服务的 [onBind()](https://developer.android.google.cn/reference/android/app/Service?hl=zh-cn#onBind(android.content.Intent)) 方法以生成 IBinder。然后,系统会将该 IBinder 传递至绑定到同一服务的所有其他客户端,无需再次调用 onBind()。

android:layout_row 显示该子控件的行 以0计 android:layout_rowSpan 该控件所占的行数, 例如android:layout_rowSpan="2",表示当前子控件占两行

当系统启动某个组件时,它会启动该应用的进程 (如果尚未运行) , 并实例化该组件所需的类. 例如, 如果您的应用启动相机应用中拍摄照片的 Activity, 则该 Activity 会在属于相机应用的进程 (而非您的应用进程) 中运行.因此, 与大多数其他系统上的应用不同, Android 应用并没有单个入口点 (即没有 main() 函数) .

id各方回应

如果是要从A界面传到B界面, B界面要再传到C界面, Intent就要写两遍添加值的方法 那么 如果我用1个Bundle 直接把值先存里边 然后再存到Intent中 不就更简洁吗?

作为android 4.0 后新增的一个布局,与前面介绍过的TableLayout(表格布局)其实有点大同小异; GridLayout的目的是将多个 View / ViewGroup 按照网格的形式排列起来, 所以大多数的属性都是为了规范一个网格的样式;

前台 前台服务执行一些用户能注意到的操作.例如, 音频应用会使用前台服务来播放音频曲目.前台服务必须显示通知.即使用户停止与应用的交互, 前台服务仍会继续运行.

id影响分析

如要创建线性布局,让每个子视图使用大小相同的屏幕空间,请将每个视图的 android:layout_height 设置为 "0dp"(针对垂直布局

如果您必须在主线程之外执行操作, 但只在用户与您的应用交互时执行此操作, 则应创建新线程.例如, 如果您只是想在 Activity 运行的同时播放一些音乐, 则可在 onCreate() 中创建线程, 在 onStart() 中启动线程运行, 然后在 onStop() 中停止线程.您还可考虑使用 AsyncTask 或 HandlerThread, 而非传统的 Thread 类.如需了解有关线程的详细信息, 请参阅进程和线程文档.

组件源码

布局文件创建完成后, 可以在java代码或者XML中使用

Services overview

属性 说明 layout_constraintLeft_toRightOf 放到相对于某个组件右边; 本组件靠左

位于res/valus目录下, 根元素是标记, 在该元素中使用标记定义字符串.其中name属性来指定字符串的名称(name不可大写)

约束布局ConstraintLayout 是一个ViewGroup, 可以在Api9 以上的Android系统使用它, 它的出现主要是为了解决布局嵌套过多的问题, 以灵活的方式定位和调整小部件.从 Android Studio 2.3 起, 官方的模板默认使用 ConstraintLayout.

AndroidManifest.xml 注册

Android 开发指南 >应用组件

属性 说明 android:layout_marginStart 设置一个控件相对另一个控件的外边距:

如果您希望用户无法关闭通知,请在使用 Notification.Builder 创建通知时将 true 传入 setOngoing() 方法。

借助广播接收器组件, 系统能够在常规用户流之外向应用传递事件, 从而允许应用响应系统范围内的广播通知.由于广播接收器是另一个明确定义的应用入口,因此系统甚至可以向当前未运行的应用传递广播.

onDestroy() 当不再使用服务且准备将其销毁时, 系统会调用此方法.服务应通过实现此方法来清理任何资源, 如线程 注册的侦听器 接收器等.这是服务接收的最后一个调用.

应用组件是 Android 应用的基本构建块.每个组件都是一个入口点, 系统或用户可通过该入口点进入您的应用.有些组件会依赖于其他组件.

android:layout_rowWeight 该控件的行权重, 原理同android:layout_columnWeight

\res\drawable-hdpi

//已完成开机 adb shell am broadcast -a android.intent.action.BOOT_COMPLETED

layout_sample_view_load.xml

Activity 是与用户交互的入口点.它表示拥有界面的单个屏幕.例如, 电子邮件应用可能有一个显示新电子邮件列表的 Activity 一个用于撰写电子邮件的 Activity 以及一个用于阅读电子邮件的 Activity.

使用: a textview.setTextSize(getResources().getDimension(R.dimen.title)); b

注意: 如果您的应用面向 API 级别 26 或更高版本, 当应用本身未在前台运行时, 系统会对运行后台服务施加限制.在诸如此类的大多数情况下, 您的应用应改为使用计划作业.

developer.android 线性布局

当前 View 占据的空间 android:layout_rowSpan: 设置当前 View 占据几行的空间 android:layout_columnSpan: 设置当前 View 占据几列的空间

在xml

需要 访问相机 和 读写文件权限

var listview = findViewById<ListView>(R.id.listview)

//传递参数 启动

[[N_Android]]

使用Handler 的 post方法,传入一个Runnable接口, 里面run方法 就可以更新UI了

ContentResolver 您可以通过在 ContentResolver 上调用 query(), 对内容提供程序执行查询.

使用

在Android 3.0中除了我们重点讲解的Fragment外, Action Bar也是一个非常主要的交互元素, Action Bar取代了传统的tittle bar和menu, 在程序运行中一直置于顶部

不会指定特定的组件, 而是声明要执行的常规操作, 从而允许其他应用中的组件来处理.例如, 如需在地图上向用户显示位置, 则可以使用隐式 Intent, 请求另一具有此功能的应用在地图上显示指定的位置.

每种组件都有不同的启动方法:

假设控件B要放在控件A的右侧, 可以使用 layout_constraintLeft_toRightOf 属性.

https://www.cnblogs.com/guanxinjing/p/9708613.html

属性 说明 android:alignmentMode 说明: 当设置alignMargins, 使视图的外边界之间进行校准.可以取以下值: alignBounds – 对齐子视图边界/alignMargins – 对齐子视距内容 android:columnCount GridLayout的最大列数 android:rowCount GridLayout的最大行数 android:columnOrderPreserved 当设置为true, 使列边界显示的顺序和列索引的顺序相同.默认是true android:orientation GridLayout中子元素的布局方向.有以下取值: horizontal:水平布局/vertical – 竖直布局 android:rowOrderPreserved 当设置为true, 使行边界显示的顺序和行索引的顺序相同.默认是true android:useDefaultMargins 当设置ture, 当没有指定视图的布局参数时, 告诉GridLayout使用默认的边距.默认值是false

属性 说明 android:layout_column 显示该子控件的列, 以0计 android:layout_columnSpan 该控件所占的列数

广播接收器作为 BroadcastReceiver 的子类实现, 并且每条广播都作为 Intent 对象进行传递.

运行时调用hide()方法也可以隐藏ActionBar, 调用show()方法来显示ActionBar().

启动组件 在四种组件类型中, 有三种 (Activity 服务和广播接收器) 均通过异步消息Intent 进行启动.Intent 会在运行时对各个组件进行互相绑定.您可以将 Intent 视为从其他组件 (无论该组件是属于您的应用还是其他应用) 请求操作的信使.

在该服务内(通常在 onStartCommand() 中),您可以请求在前台运行您的服务。为此,请调用 ServiceCompat.startForeground()(在 androidx-core 1.12 及更高版本中提供)。此方法采用以下参数:

foreground-services

自身属性

其他应用可通过你创建的内容提供程序查询或修改数据(如果内容提供程序允许), 提供一个标准在不同应用之间访问数据

LinearLayout 又称线性布局, 该布局应该是 Android 视图设计中最经常使用的布局; 该布局可以使放入其中的组件以水平方式或者垂直方式整齐排列, 通过 android:orientation 属性指定具体的排列方式, 通过 weight 属性设置每个组件在布局中所占的比重;

//低电量 adb shell am broadcast -a android.intent.action.ACTION_BATTERY_LOW

https://developer.android.google.cn/develop/background-work/services/bound-services?hl=zh-cn

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

通过提供目标应用的软件包名称或完全限定的组件类名来指定可处理 Intent 的应用.通常, 您会在自己的应用中使用显式 Intent 来启动组件, 这是因为您知道要启动的 Activity 或服务的类名.例如, 您可能会启动您应用内的新 Activity 以响应用户操作, 或者启动服务以在后台下载文件.

许多广播均由系统发起, 例如, 通知屏幕已关闭 电池电量不足或已拍摄照片的广播. 应用也可发起广播, 例如, 通知其他应用某些数据已下载至设备, 并且可供其使用.尽管广播接收器不会显示界面, 但其可以创建状态栏通知, 在发生广播事件时提醒用户.

后台 后台服务执行用户不会直接注意到的操作.例如, 如果应用使用某个服务来压缩其存储空间, 则此服务通常是后台服务.

简单地说, 服务是一种即使用户未与应用交互也可在后台运行的组件, 因此, 只有在需要服务时才应创建服务.

android:layout_columnWeight 该控件的列权重, 与android:layout_weight类似, 例如有GridLayout上两列, 都设置android:layout_columnWeight = "1",则两列各占GridLayout宽度的 一半

活动代表了一个具有用户界面的单一屏幕, 如 Java 的窗口或者帧.Android 的活动是 ContextThemeWrapper 类的子类.

//自定义 adb shell am broadcast -a ACTION_TEST

这些类型可能是清单中声明的类型的子集,具体取决于特定用例。然后,如果需要添加更多服务类型,可以再次调用 startForeground()。

使用: a 在MainActivity中使用:gerResources().getString(R.string.name) b 在TextView中使用:

Broadcast 您可以通过向 sendBroadcast() sendOrderedBroadcast() 或 sendStickyBroadcast() 等方法传递 Intent 来发起广播.

如果你曾经用 C,C++ 或者 Java 语言编程, 你应该知道这些程序从 main() 函数开始.很类似的, Android 系统初始化它的程序是通过活动中的 onCreate() 回调的调用开始的.存在有一序列的回调方法来启动一个活动, 同时有一序列的方法来关闭活动,

当AsyncTask已经完成, 或则以及被取消, 亦或其他原因不能被取消, 调用cancel()会失败;

如果应用以 Android 9(API 级别 28)或更高版本为目标平台并使用前台服务,则需要在应用清单中请求 FOREGROUND_SERVICE,如以下代码段所示。这是普通权限,因此,系统会自动为请求权限的应用授予此权限。

请记住, 如果您确实要使用服务,则默认情况下, 它仍会在应用的主线程中运行, 因此, 如果服务执行的是密集型或阻止性操作, 则您仍应在服务内创建新线程.

在MVC模型中 Adapter 这个Controller的部分: Model(数据) ---> Controller(以什么方式显示到)---> View(用户界面) 这就是简单MVC组件的简单理解!

android:name=".receiver.BootBroadcastReceiver" //指定类名

Intent 和 Intent过滤器

与 Activity 服务和广播接收器不同,内容提供程序并非由 Intent 启动.相反, 它们会在成为 ContentResolver 的请求目标时启动.内容解析程序会通过内容提供程序处理所有直接事务, 因此通过提供程序执行事务的组件便无需执行事务, 而是改为在 ContentResolver 对象上调用方法.这会在内容提供程序与请求信息的组件之间留出一个抽象层 (以确保安全) .

\res\drawable-ldpi

使用:

onBind() 当另一个组件想要与服务绑定 (例如执行 RPC) 时, 系统会通过调用 bindService() 来调用此方法.在此方法的实现中, 您必须通过返回 IBinder 提供一个接口, 以供客户端用来与服务进行通信.请务必实现此方法; 但是, 如果您并不希望允许绑定, 则应返回 null.

\drawable-v24 \drawable

尽管这些 Activity 通过协作在电子邮件应用中形成一种紧密结合的用户体验, 但每个 Activity 都独立于其他 Activity 而存在.因此, 其他应用可以启动其中任何一个 Activity (如果电子邮件应用允许) . 例如, 相机应用可以启动电子邮件应用内用于撰写新电子邮件的 Activity, 以便用户共享图片.

回调 描述 onCreate() 这是第一个回调, 在活动第一次创建时调用 onStart() 这个回调在活动为用户可见时被调用 onResume() 这个回调在应用程序与用户开始可交互的时候调用 onPause() 被暂停的活动无法接受用户输入, 不能执行任何代码.当前活动将要被暂停, 上一个活动将要被恢复时调用 onStop() 当活动不在可见时调用 onDestroy() 当活动被系统销毁之前调用 onRestart() 当活动被停止以后重新打开时调用

在Android SDK 23中,startActivityForResult和onActivityResult,已经被官方标记为弃用了,继而推出了名为Activity Result API的组件。

例如, 显式请求可能会告诉系统"在 Gmail 应用中启动‘发送电子邮件’Activity", 而隐式请求可能会告诉系统"在任何能够完成此工作的 Activity 中启动‘发送电子邮件’屏幕".当系统界面询问用户使用哪个应用来执行任务时, 这就是 intent 过滤器在起作用.

以下是前台服务的示例:

属性

如果有三个文本字段,其中两个声明权重为 1,另一个未赋予权重,那么没有权重的第三个文本字段就不会展开,而仅占据其内容所需的区域。另一方面,另外两个文本字段将以同等幅度展开,填充测量三个字段后仍剩余的空间。 如果有三个文本字段,其中两个字段声明权重为 1,而为第三个字段赋予权重 2(而非 0),那么现在相当于声明第三个字段比另外两个字段更为重要,因此,该字段将获得总剩余空间的一半,而其他两个字段均享余下的空间。

map_layers_list.xml

[[N_Android]]

如果AsyncTask已经开始执行, 参数mayInterruptIfRunning决定是否立即stop该Task;

\res\drawable-mdpi

绑定服务是客户端-服务器接口中的服务器。它允许 activity 等组件绑定到服务、发送请求、接收响应,以及执行进程间通信 (IPC)。绑定服务通常只在为其他应用组件提供服务时处于活动状态,不会无限期在后台运行。

搞活动签名的项目源码

首先在 AndroidManifest.xml 注册

使用 ConstraintLayout 构建自适应界面

如果AsyncTask还没有开始执行, 调用cancel(true)函数后, AsyncTask不会再执行;

ActionBar actionBar = getActionBar(); actionBar.hide();

github项目地址

//另外一边 接受

android:layout_weight: 指定该子元素在LinearLayout中所占的权重, 值越大权重越低!

onStartCommand() 当另一个组件 (如 Activity) 请求启动服务时, 系统会通过调用 startService() 来调用此方法.执行此方法时, 服务即会启动并可在后台无限期运行.如果您实现此方法, 则在服务工作完成后, 您需负责通过调用 stopSelf() 或 stopService() 来停止服务. (如果您只想提供绑定, 则无需实现此方法.)

服务启动后, 其生命周期即独立于启动它的组件.即使系统已销毁启动服务的组件, 该服务仍可在后台无限期地运行.因此, 服务应在其工作完成时通过调用 stopSelf() 来自行停止运行, 或者由另一个组件通过调用 stopService() 来将其停止.

关键方法: onBind() 当另一个组件想要与服务绑定 (例如执行 RPC) 时, 系统会通过调用 bindService() 来调用此方法.在此方法的实现中, 您必须通过返回 IBinder 提供一个接口, 以供客户端用来与服务进行通信.请务必实现此方法; 但是, 如果您并不希望允许绑定, 则应返回 null.

https://www.runoob.com/w3cnote/android-tutorial-adapter.html

https://developer.android.google.cn/develop/background-work/services?hl=en

Android 开发指南 >Activity

值得注意的是, 调用cancel(true)函数需要注意以下几点:

\res\drawable-xdpi

Drawable资源一般存储在应用程序目录的\res\drawable目录下,当然依据分辨率的高低可以分别存储不同分辨率的资源到如下几个目录:

常用属性: 属性 说明 android:shrinkColumns 设置可收缩的列, 内容过多就收缩显示到第二行 android:stretchColumns 设置可伸展的列, 将空白区域填充满整个列 android:collapseColumns 设置要隐藏的列 列的索引从0开始, shrinkColumns和stretchColumns可以同时设置.

layout_gravity: 设置一些对齐方式, 以及填满容器

[[N_Android]]

在你的 Activity 中

使用: a textview.setTextColor(getResources().getColor(R.color.red)); <TextView android:textcolor="@color/red"/>

启动服务由另一个组件通过调用 startService() 启动, 这会导致调用服务的 onStartCommand() 方法.

//扩展卡 已挂载 adb shell am broadcast -a android.intent.action.ACTION_MEDIA_MOUNTED

前台通知 实现

由于系统在单独的进程中运行每个应用, 且其文件权限会限制对其他应用的访问, 因此您的应用无法直接启动其他应用中的组件, 但 Android 系统可以.如要启动其他应用中的组件, 请向系统传递一条消息,说明启动特定组件的 Intent.系统随后便会为您启动该组件.

Service 在 Android 5.0 (API 级别 21) 及更高版本中, 您可以使用 JobScheduler 类来调度操作.对于早期 Android 版本, 您可以通过向 startService() 传递 Intent 来启动服务 (或对执行中的服务下达新指令) .您也可通过向将 bindService() 传递 Intent 来绑定到该服务.

Service 是一种可在后台执行长时间运行操作而不提供界面的应用组件.服务可由其他应用组件启动, 而且即使用户切换到其他应用, 服务仍将在后台继续运行.此外, 组件可通过绑定到服务与之进行交互, 甚至是执行进程间通信 (IPC).例如, 服务可在后台处理网络事务 播放音乐, 执行文件 I/O 或与内容提供程序进行交互.

在java

ListView 则是将要应用 Adapter 的容器

跟LinearLayout(线性布局)一样,他可以设置容器中组件的对齐方式 容器中的组件可以跨多行也可以跨多列(相比TableLayout直接放组件,占一行相比较)

Activity 如要启动 Activity, 您可以向 startActivity() 或 startActivityForResult() 传递 Intent (当您想让 Activity 返回结果时) , 或者为其安排新任务.

[[N_Android]]

参考 Android-自定义控件开发

map_layers_list_item.xml

android:gravity 用于设置View组件的对齐方式  android:layout_gravity 用于设置Container组件的对齐方式

在Android 5.1(API Level 21)时引入了android:layout_columnWeight和android:layout_rowWeight来解决平分状况

onCreate() 首次创建服务时, 系统会 (在调用 onStartCommand() 或 onBind() 之前) 调用此方法来执行一次性设置程序.如果服务已在运行, 则不会调用此方法.

显示一个列表供用户选择。

注意要重写几个有参构造

调用cancel()后, doInBackground()完成后, 不再调用onPostExecute(), 而是执行onCancelled();

子元素属性

注意: android 9+ 需FOREGROUND_SERVICE权限:

在Android开发中我们是用Drawable类来Drawable类型资源的.

ScrollView 有时候,我们在写布局的时,在最外层会套一个ScrollView,以防止内容超出屏幕的时候可以滚动。但如果这时候,内容不足以覆盖整个屏幕时,ScrollView 的android:layout_height="match_parent"属性是无效的,它始终都是wrap_content,这时可以使用android:fillViewport="true" 和 让它生效。

android:alignParentBottom 若是该值为true,则将该控件的底部和父控件的底部对齐 android:layout_alignParentLeft 若是该值为true,则将该控件的左边与父控件的左边对齐 android:layout_alignParentRight 若是该值为true,则将该控件的右边与父控件的右边对齐 android:layout_alignParentTop 若是该值为true,则将空间的顶部与父控件的顶部对齐 // 控件 android:layout_centerHorizontal 若是值为真,该控件将被至于水平方向的中央 android:layout_centerInParent 若是值为真,该控件将被至于父控件水平方向和垂直方向的中央 android:layout_centerVertical 若是值为真,该控件将被至于垂直方向的中央

共有四种不同的应用组件类型:

表格布局继承自LinearLayout, 通过TableRow 设置行,列数由TableRow中的子控件决定, 直接在TableLayout中添加子控件会占据整个一行.

SampleViewActivity.java

声明:本文信息来源于相关渠道或网络,版权归原作者所有。如涉及版权问题请及时与本站联系删除。本文观点仅供参考,不代表本站立场。