首页 > 其他分享 >Android开发笔记[10]-关于页

Android开发笔记[10]-关于页

时间:2024-03-17 10:34:02浏览次数:26  
标签:10 modifier compose androidx 笔记 param import Android Modifier

摘要

构建关于页、最终用户许可页(EULA)页和隐私协议页;Compose页面中嵌入xml布局;Compose页面中添加markdown文本.

关键信息

  • Android Studio:Iguana | 2023.2.1
  • Gradle:distributionUrl=https://services.gradle.org/distributions/gradle-8.4-bin.zip
  • jvmTarget = '1.8'
  • minSdk 21
  • targetSdk 34
  • compileSdk 34
  • 开发语言:Kotlin,Java
  • ndkVersion = '21.1.6352462'
  • kotlin版本:1.9.20
  • kotlinCompilerExtensionVersion '1.5.4'
  • com.android.library:8.3

原理简介

EULA(最终用户许可协议)

[https://blog.csdn.net/LingLing1301/article/details/124561891]
最终用户许可协议(End User Licence Agreement,EULA),指的是一家公司的软件与软件的使用者所达成的协议,此协议一般在软件安装时出现。如果使用者拒绝接受这家公司的EULA,那么便不能安装此软件。最终用户许可协议是软件应用程序作者或者发布者与应用程序使用者之间的合法合同。最终用户许可协议(EULA),通常是指“软件许可”,它与租赁协议类似;用户同意支付软件的使用费用,并且向软件作者或者发行者承诺遵守EULA中规定的所有约束条件。用户被告知,当他们打开软件包的包装、打开CD盒的封条、将卡片寄回给软件发行者、安装应用程序、执行下载文件或者简单的使用应用程序的时候就意味着他们已经“接受”了EULA中的条款。用户可以寄回软件产品或者在安装过程中当EULA提示接受按钮的时候点击“我不接受”来拒绝这个协议。

Markwon简介

[https://github.com/noties/Markwon]
[https://noties.io/Markwon/]
Markwon is a markdown library for Android. It parses markdown following commonmark-spec with the help of amazing commonmark-java library and renders result as Android-native Spannables. No HTML is involved as an intermediate step. No WebView is required. It's extremely fast, feature-rich and extensible.
It gives ability to display markdown in all TextView widgets (TextView, Button, Switch, CheckBox, etc), Toasts and all other places that accept Spanned content. Library provides reasonable defaults to display style of a markdown content but also gives all the means to tweak the appearance if desired. All markdown features listed in commonmark-spec are supported (including support for inlined/block HTML code, markdown tables, images and syntax highlight).
Markwon comes with a sample application. It is a collection of library usages that comes with search and source code for each code sample.
Since version 4.2.0 Markwon comes with an editor to highlight markdown input as user types (for example in EditText).
Markwon 是一个用于 Android 的 Markdown 库。它使用令人惊叹的 commonmark-java 库解析遵循 CommonMark 规范的 Markdown,并将结果渲染为 Android 本地的 Spannables。在此过程中不涉及 HTML 作为中间步骤,也不需要 WebView。它非常快速、功能丰富且可扩展。
Markwon 能够使所有 TextView 小部件(TextView、Button、Switch、CheckBox 等)显示 Markdown,以及 Toasts 和所有接受 Spanned 内容的其他地方。库提供了合理的默认样式来显示 Markdown 内容,但如果需要,也提供了所有方法来调整外观。Markwon 支持 CommonMark 规范中列出的所有 markdown 特性(包括对内联/块级 HTML 代码、Markdown 表格、图片和语法高亮的支持)。
Markwon 附带一个示例应用程序。这是一个包含库用法的集合,每个代码示例都带有搜索和源代码。
自版本 4.2.0 起,Markwon 附带了一个编辑器,用于在用户输入时高亮显示 Markdown(例如在 EditText 中)。

「关于」页面

[https://juejin.cn/post/7139019841284866055]
关于页Compose模板
APP的「关于」页面通常包含一些基础的信息,如APP的名称、版本号、开发者信息、更新日志、隐私政策、用户协议等内容。这个页面主要是为了向用户提供一些关于APP的基本信息和说明。
具体来说,「关于」页面可能包含以下几个部分:

  1. APP名称:显示APP的全称,有时也会配合APP的Logo一起展示。
  2. 版本信息:显示当前的APP版本号,有时候还会显示此版本的更新日期。
  3. 开发者信息:显示开发者的名称、地址、联系方式等信息,有时候也会提供开发者的官方网站链接。
  4. 更新日志:列出最近几次版本更新的内容,帮助用户了解APP的新功能和改进。
  5. 隐私政策:解释APP如何处理用户的个人信息,以及如何保护用户的隐私。
  6. 用户协议:列出用户在使用APP时需要遵守的条款和条件。
    以上这些信息可以帮助用户更好地理解和使用APP,同时也能让用户感到更加安全和信任。

app的隐私政策

[http://app.gjzwfw.gov.cn/jmopen/webapp/html5/yhysxy/index.html]
[https://zhuanlan.zhihu.com/p/670072425]
APP隐私合规现状与防范措施
[https://www.goupsec.com/news/5460.html]
2021年11月1《个人信息保护法》正式施行,标志信息保护进入强监管时代,同时,APP监管也被提升到前所未有的高度,数据安全、用户隐私、甚至功能体验等各个方面都出台了相应的规则规范,监管的初衷是:从各个层面保障用户的权益,避免用户的隐私、体验、数据被滥用,甚至威胁国家安全,一旦违规被查处面临的惩罚是非常严厉的,因此产品运营方必须高度重视。一方面,在产品设计、开发阶段就要充分考虑并满足各种监管要求;另一方面,一旦查出隐患问题,要积极响应,及时整改,否则可能面临工信部通报,甚至全面下架风险,首当其冲的一块是:APP隐私合规。
APP隐私合规指简单说就是:用户隐私的收集、存储、使用、加工、传输、提供、公开、删除等都要合乎法规个人信息保护法,遵守原则。从APP端来看,它关系到用户的切身体验,用户自身也能直观感受到自己的隐私是否被过分索取。比如,申请与自身功能毫不相关的权限,不给还拒绝提供服务等场景。
正常的开发是在APP启动之初就要初始化很多环境、参数,而这些初始化很可能涉及一些隐私API的调用,在隐私合规的框架下,这些调用只能被人为延后,或者取消。
示例文本:

本软件尊重并保护所有使用服务用户的个人隐私权。为了给您提供更准确、更有个性化的服务,本软件会按照本隐私权政策的规定使用和披露您的个人信息。但本软件将以高度的勤勉、审慎义务对待这些信息。除本隐私权政策另有规定外,在未征得您事先许可的情况下,本软件不会将这些信息对外披露或向第三方提供。本软件会不时更新本隐私权政策。您在同意本软件服务使用协议之时,即视为您已经同意本隐私权政策全部内容。本隐私权政策属于本软件服务使用协议不可分割的一部分。
1.适用范围
a)在您使用本软件网络服务,本软件自动接收并记录的您的手机上的信息,包括但不限于您的健康数据、使用的语言、访问日期和时间、软硬件特征信息及您需求的网页记录等数据;
2.信息的使用
a)在获得您的数据之后,本软件会将其上传至服务器,以生成您的排行榜数据,以便您能够更好地使用服务。
3.信息披露
a)本软件不会将您的信息披露给不受信任的第三方。
b)根据法律的有关规定,或者行政或司法机构的要求,向第三方或者行政、司法机构披露;
c)如您出现违反中国有关法律、法规或者相关规则的情况,需要向第三方披露;
4.信息存储和交换
本软件收集的有关您的信息和资料将保存在本软件及(或)其关联公司的服务器上,这些信息和资料可能传送至您所在国家、地区或本软件收集信息和资料所在地的境外并在境外被访问、存储和展示。
5.信息安全
a)在使用本软件网络服务进行网上交易时,您不可避免的要向交易对方或潜在的交易对方披露自己的个人信息,如联络方式或者邮政地址。请您妥善保护自己的个人信息,仅在必要的情形下向他人提供。如您发现自己的个人信息泄密,请您立即联络本软件客服,以便本软件采取相应措施。

Compose中嵌入xml布局

[https://blog.csdn.net/u010436867/article/details/120759187]

class ComposeAndXmlActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            ComposeContent()
        }
    }

    @SuppressLint("SetTextI18n")
    @Composable
    fun ComposeContent() {
        LazyColumn(modifier = Modifier.fillMaxWidth(), content = {
            item {
                Text(
                    modifier = Modifier
                        .fillMaxWidth()
                        .height(100.dp)
                        .background(color = Color.Green),
                    textAlign = TextAlign.Center,
                    text = "Compose 部分-头部",
                )    

                /* start XML布局部分 */
                AndroidView(
                    modifier = Modifier
                        .fillMaxWidth()
                        .padding(8.dp),
                    factory = { ctx ->
                        val view =
                            LayoutInflater.from(ctx).inflate(R.layout.activity_compose_xml, null)
                        view.findViewById<TextView>(R.id.fromXML).text = "Xml布局部分"
                        view
                    },
                )
                /* end XML布局部分 */

            }
            item {
                Text(
                    modifier = Modifier
                        .fillMaxWidth()
                        .height(100.dp)
                        .padding(8.dp)
                        .background(color = Color.Yellow),
                    textAlign = TextAlign.Center,
                    text = "Compose 部分-尾部",
                )
            }
        })
    }
}

xml布局:

<?xml version="1.0" encoding="utf-8"?>
<androidx.appcompat.widget.LinearLayoutCompat xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">
    <TextView
        android:id="@+id/fromXML"
        android:layout_width="match_parent"
        android:layout_height="100dp"
        android:background="@color/black"
        android:gravity="center"
        android:text="..."
        android:textColor="@color/white"
        android:textSize="12sp" />
</androidx.appcompat.widget.LinearLayoutCompat>

实现

  1. 配置gradle
    build.gradle
/* start markdown相关 */
implementation "io.noties.markwon:core:4.6.2"
implementation 'io.noties.markwon:image:4.6.2'
implementation 'io.noties.markwon:image-glide:4.6.2'
/* end markdown相关 */
  1. 核心代码
    AboutActivity.kt
package cn.qsbye.alittlesmile_android

import android.content.Intent
import android.os.Bundle
import android.view.LayoutInflater
import android.widget.TextView
import android.widget.Toast
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.outlined.Star
import androidx.compose.material3.Icon
import androidx.compose.material3.LocalTextStyle
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Surface
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.remember
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Brush
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.unit.dp
import androidx.compose.ui.viewinterop.AndroidView
import androidx.core.content.ContextCompat.startActivity
import androidx.navigation.NavHostController
import cn.qsbye.alittlesmile_android.AboutPageClass.AboutScreen
import cn.qsbye.alittlesmile_android.AboutPageClass.BaseTextItem
import cn.qsbye.alittlesmile_android.AboutPageClass.LinkText
import cn.qsbye.alittlesmile_android.AboutPageClass.ModuleItem
import cn.qsbye.alittlesmile_android.AboutPageClass.MyViewModel
import cn.qsbye.alittlesmile_android.AboutPageClass.NormalSubItemWithStartIconData
import cn.qsbye.alittlesmile_android.AboutPageClass.NormalWithStartIconSubItemModule
import cn.qsbye.alittlesmile_android.AboutPageClass.RightsTextItem
import cn.qsbye.alittlesmile_android.AboutPageClass.boxSampleIcon
import cn.qsbye.alittlesmile_android.ui.theme.Alittlesmile_androidTheme
import io.noties.markwon.Markwon

class AboutActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            Alittlesmile_androidTheme {
                // A surface container using the 'background' color from the theme
                Surface(
                    modifier = Modifier.fillMaxSize(),
                    color = MaterialTheme.colorScheme.background
                ) {
                    // 显示关于页内容
                    MyAboutPage(MyViewModel(),this@AboutActivity) // 这里假设你有一个 MyViewModel 实例
                }
            }
        }
    }
}

/* start 继承于关于页模板AboutPageClass */
// 添加context作为上下文参数传入
@Composable
fun MyAboutPage(myViewModel: MyViewModel, context_input: AboutActivity) {
    val list = remember {
        listOf(
            NormalSubItemWithStartIconData("给我好评

标签:10,modifier,compose,androidx,笔记,param,import,Android,Modifier
From: https://www.cnblogs.com/qsbye/p/18078232

相关文章

  • LeetCode 7 / 100
    哈希表、双指针哈希表两数之和字母异位词分组最长连续序列双指针移动零盛最多水的容器三数之和接雨水LeetCode1.两数之和LeetCode49.字母异位词分组LeetCode128.最长连续序列LeetCode[283.移动零](https://leetcode.cn/problems/move-zeroes/?envType=st......
  • 滴水逆向笔记系列-win32总结4-50.创建线程-51.线程控制_CONTEXT结构
    第五十课win32创建线程1.进程与线程程序就是在硬盘里还没跑起来的二进制文件,进程就是已经运行中的程序,一个进程至少有一个线程,比如一个正在举行的活动需要几十个人帮忙干活,进程就是那个活动,线程就是那几十个人一个线程启动是需要占用一个cpu的一个新线程也会创建一个新堆......
  • 滴水逆向笔记系列-win32总结5-52.临界区-53.互斥体
    第五十二课win32临界区1.线程安全问题其实就是多个线程同时对一个资源(即全局变量等)进行操作2.临界区设计图临界区的使用1、创建CRITICAL_SECTION: CRITICAL_SECTIONcs; 2、在使用前进行初始化 InitializeCriticalSection(&cs); ......
  • 滴水逆向笔记系列-win32总结1-43.宽字节-44.事件_消息_消息处理函数
    第四十三课win32宽字节1.编码0x00.ASCII码1、ASCII码使用指定的7位或8位二进制数组合来表示128或256种可能的字符2、标准ASCII码使用7位二进制数来表示所有的大写和小写字母,数字0到9、标点符号,以及在美式英语中使用的特殊控制字符。3、扩展ASCII码允许将......
  • 滴水逆向笔记系列-win32总结2-45.esp寻址_定位回调函数-46.子窗口_消息处理函数-47.资
    第四十五课win32esp寻址_定位回调函数自己vs编译的exe入口函数好像和课程视频哩的vc6不一样,没办法跟着视频走,可以用课件里给的作业exe勉强跟着视频学,前面的都差不多,课件下载地址:https://www.bcdaren.com/video/videoPlay/3303185150621818881.win32应用程序入口识别没加过壳......
  • 滴水逆向笔记系列-win32总结3-48.提取图标_修改标题-49.通用控件_实现LoadPE
    第四十八课win32提取图标_修改标题1.添加图标a,.右键添加icon时不要直接新建,导入b.加载图标:::infoHICONhIcon;hIcon=LoadIcon(hAppInstance,MAKEINTRESOURCE(IDI_ICON));hAppInstance 应用程序句柄IDI_ICON 图标编号MAKEINTRESOURCE 用这个宏的主要原因......
  • 路由笔记
    1.1路由路由是一个比较广义和抽象的概念,路由的本质就是对应关系。在开发过程中,路由分为:前端路由和后端路由。后端路由:概念----根据不同的用户URL请求,服务器端返回不同的内容。        本质----URL请求地址与服务器资源之间的对应关系。       (......
  • buuctf靶机笔记3
    BUUXSSCOURSE首页如此显然是持久性xss将数据存储到后台管理员访问后台触发xss后可以盗取cookie对后台进行登录但我们还不知道后台地址先尝试:<script>alert(1)</script>提交成功尝试访问没有触发弹窗可能后台存在过滤尝试用img标签:<imgsrc='11'onerror=alert(11......
  • SpringBoot笔记
    SpringBoot官方文档:SpringBoot什么是SpringSpring是一个开源框架,2003年兴起的一个轻量级的Java开发框架,作者:RodJohnson。Spring是为了解决企业级应用开发的复杂性而创建的,简化开发。Spring如何简化Java开发为了降低Java开发的复杂性,Spring采用了以下4种关键策略:基......
  • 算法学习笔记(46): 离散余弦变换(DCT)
    前置知识:离散傅里叶变换傅里叶变换在上文中更多的是OI中的理解以及应用。但是傅里叶变换奥秘还很多。回顾\(\omega_n\)在傅里叶变换中的定义:\(e^{i\frac{2\pi}n}\),存在\(\omega_n^n=1\)的性质。意味着离散傅里叶变换实际上是周期性的,这也变相的解释了为什么存在循环......