开源 java android app 开发(五)文件和数据库存储

非标准包 game.rgss3a 的打开方法 | 2023 年实测 生活笔记 阅读详情

 文章的目的为了记录使用java 进行android app 开发学习的经历。本职为嵌入式软件开发,公司安排开发app,临时学习,完成app的开发。开发流程和要点有些记忆模糊,赶紧记录,防止忘记。

    相关链接:

开源 java android app 开发(一)开发环境的搭建-优快云博客

开源 java android app 开发(二)工程文件结构-优快云博客

开源 java android app 开发(三)GUI界面布局和常用组件-优快云博客

开源 java android app 开发(四)GUI界面重要组件-优快云博客

开源 java android app 开发(五)文件和数据库存储-优快云博客

开源 java android app 开发(六)多媒体使用-优快云博客

开源 java android app 开发(七)通讯之Tcp和Http-优快云博客

开源 java android app 开发(八)通讯之Mqtt和Ble-优快云博客

开源 java android app 开发(九)后台之线程和服务-优快云博客

开源 java android app 开发(十)广播机制-优快云博客

开源 java android app 开发(十一)调试、发布-优快云博客

开源 java android app 开发(十二)封库.aar-优快云博客

开源 java android app 开发(十三)自定义绘图控件--游戏摇杆

开源 java android app 开发(十四)自定义绘图控件--波形图

开源 java android app 开发(十五)自定义绘图控件--仪表盘

开源 java android app 开发(十六)自定义绘图控件--圆环

推荐链接:

开源C# .net mvc 开发(一)WEB搭建_c#部署web程序-优快云博客

开源 C# .net mvc 开发(二)网站快速搭建_c#网站开发-优快云博客

开源 C# .net mvc 开发(三)WEB内外网访问(VS发布、IIS配置网站、花生壳外网穿刺访问)_c# mvc 域名下不可訪問內網,內網下可以訪問域名-优快云博客

开源 C# .net mvc 开发(四)工程结构、页面提交以及显示_c#工程结构-优快云博客

开源 C# .net mvc 开发(五)常用代码快速开发_c# mvc开发-优快云博客

本章节主要内容是常态化的存储,SharedPreferences存储组件,sqlite3 数据库存储组件。

在APP中经常需要读写用户密码,或本地信息。这时就需要用到文件和数据库,需要常态化的存储编程。

本章内容如下:

1.SharedPreferences存储组件

2.sqlite3 数据库存储组件

一、SharedPreferences 是一个轻量级的存储组件,用于存储简单的键值对数据。它通常用于存储应用的配置信息、用户偏好设置等。

下面是一个使用 Java 在 Android Studio 中编写 SharedPreferences 读写操作的示例。

1.1新建SharedPreferencesHelper类

public class SharedPreferencesHelper {

    private static final String PREFS_NAME = "MyAppPreferences"; // SharedPreferences 文件名

    /**
     * 保存数据到 SharedPreferences
     *
     * @param context 上下文
     * @param key     键
     * @param value   值
     */
    public static void saveData(Context context, String key, String value) {
        SharedPreferences sharedPreferences = context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE);
        SharedPreferences.Editor editor = sharedPreferences.edit();
        editor.putString(key, value);
        editor.apply(); // 或者使用 editor.commit(),但 apply() 是异步的,性能更好
    }

    /**
     * 从 SharedPreferences 读取数据
     *
     * @param context 上下文
     * @param key     键
     * @return 保存的值,如果不存在则返回 null
     */
    public static String getData(Context context, String key) {
        SharedPreferences sharedPreferences = context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE);
        return sharedPreferences.getString(key, null); // 第二个参数是默认值,如果键不存在则返回
    }

    /**
     * 删除 SharedPreferences 中的某个键值对
     *
     * @param context 上下文
     * @param key     键
     */
    public static void removeData(Context context, String key) {
        SharedPreferences sharedPreferences = context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE);
        SharedPreferences.Editor editor = sharedPreferences.edit();
        editor.remove(key);
        editor.apply();
    }

    /**
     * 清空 SharedPreferences 中的所有数据
     *
     * @param context 上下文
     */
    public static void clearAllData(Context context) {
        SharedPreferences sharedPreferences = context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE);
        SharedPreferences.Editor editor = sharedPreferences.edit();
        editor.clear();
        editor.apply();
    }
}

1.2添加MainActivity代码

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

// 示例:保存数据
        SharedPreferencesHelper.saveData(this, "username", "JohnDoe");
        SharedPreferencesHelper.saveData(this, "email", "johndoe@example.com");

        // 示例:读取数据
        String username = SharedPreferencesHelper.getData(this, "username");
        String email = SharedPreferencesHelper.getData(this, "email");

        Log.d("username","Username: " + username);
        Log.d("email","Email: " + email);


        // 示例:删除数据
        SharedPreferencesHelper.removeData(this, "email");

        // 示例:清空所有数据
        SharedPreferencesHelper.clearAllData(this);




    }
}

工程最后如下图

二、SQLite3是一个嵌入式数据库系统,它的数据库就是一个文件。

2.1首先需要创建一个 SQLiteOpenHelper 的子类,用于管理数据库的创建和版本管理。

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

public class DBHelper extends SQLiteOpenHelper {
    private static final String DATABASE_NAME = "example.db";
    private static final int DATABASE_VERSION = 1;
    private static final String TABLE_NAME = "users";
    private static final String COLUMN_ID = "id";
    private static final String COLUMN_NAME = "name";
    private static final String COLUMN_AGE = "age";

    private static final String CREATE_TABLE = "CREATE TABLE " + TABLE_NAME + " (" +
            COLUMN_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
            COLUMN_NAME + " TEXT, " +
            COLUMN_AGE + " INTEGER)";

    public DBHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL(CREATE_TABLE);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
        onCreate(db);
    }
}

2.2数据库操作类,创建DatabaseManager类用于执行增删改查操作。

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;

public class DatabaseManager {
    private DBHelper dbHelper;

    public DatabaseManager(Context context) {
        dbHelper = new DBHelper(context);
    }

    // 插入数据
    public void insert(String name, int age) {
        SQLiteDatabase db = dbHelper.getWritableDatabase();
        ContentValues values = new ContentValues();
        values.put(DBHelper.COLUMN_NAME, name);
        values.put(DBHelper.COLUMN_AGE, age);
        db.insert(DBHelper.TABLE_NAME, null, values);
        db.close();
    }

    // 更新数据
    public void update(int id, String name, int age) {
        SQLiteDatabase db = dbHelper.getWritableDatabase();
        ContentValues values = new ContentValues();
        values.put(DBHelper.COLUMN_NAME, name);
        values.put(DBHelper.COLUMN_AGE, age);
        db.update(DBHelper.TABLE_NAME, values, DBHelper.COLUMN_ID + " = ?",
                new String[]{String.valueOf(id)});
        db.close();
    }

    // 删除数据
    public void delete(int id) {
        SQLiteDatabase db = dbHelper.getWritableDatabase();
        db.delete(DBHelper.TABLE_NAME, DBHelper.COLUMN_ID + " = ?",
                new String[]{String.valueOf(id)});
        db.close();
    }

    // 查询所有数据
    public Cursor getAllData() {
        SQLiteDatabase db = dbHelper.getReadableDatabase();
        return db.rawQuery("SELECT * FROM " + DBHelper.TABLE_NAME, null);
    }
}

3.在Activity中使用,可以使用 DatabaseManager 来执行数据库操作。

import android.database.Cursor;
import android.os.Bundle;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity {
    private DatabaseManager dbManager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        dbManager = new DatabaseManager(this);

        // 插入数据
        dbManager.insert("Alice", 25);
        dbManager.insert("Bob", 30);

        // 更新数据
        dbManager.update(1, "Alice Smith", 26);

        // 删除数据
        dbManager.delete(2);

        // 查询数据
        Cursor cursor = dbManager.getAllData();
        if (cursor != null && cursor.moveToFirst()) {
            do {
                int id = cursor.getInt(cursor.getColumnIndex(DBHelper.COLUMN_ID));
                String name = cursor.getString(cursor.getColumnIndex(DBHelper.COLUMN_NAME));
                int age = cursor.getInt(cursor.getColumnIndex(DBHelper.COLUMN_AGE));
                Toast.makeText(this, "ID: " + id + ", Name: " + name + ", Age: " + age, Toast.LENGTH_SHORT).show();
            } while (cursor.moveToNext());
            cursor.close();
        }
    }
}

最后工程如下图

子网划分详解 还不会子网划分?看这篇就够了,保姆级教程 阅读详情

相关推荐

手把手教你用神经网络优化电机控制:从Simulink仿真到实际部署

本文提供了一套完整的工程实践指南,详细讲解了如何将神经网络应用于电机控制,从Simulink仿真建模、轻量级网络设计,到关键的模型量化与代码生成,最终实现向DSP/FPGA硬件的实际部署。文章直面实时性、精度与资源限制等核心工程挑战,为工程师提供了从理论到落地的清晰路径和实用避坑策略。

weixin_29246195的博客 226

开源 java android app 开发(一)开发环境的搭建

本文记录了作者从嵌入式软件开发转向Android应用开发的学习经历,重点介绍了Android Studio开发环境的安装与配置过程。文章详细描述了IDE的安装、SDK的安装与配置、环境设置以及Gradle的配置,特别是解决了由于jcenter网站关闭导致的证书错误问题,通过添加阿里云等国内镜像库来确保依赖库的正常拉取。此外,还提到了使用国内镜像加速Gradle的下载,以提高开发效率。本文旨在为遇到类似问题的开发者提供参考和解决方案。

ajassi2000的博客 703

Nacos 2.3.2与PostgreSQL的Docker化部署实战

本文详细介绍了Nacos 2.3.2与PostgreSQL的Docker化部署实战,包括环境准备、数据库配置、镜像获取与导入、容器部署及常见问题排查。通过Docker容器化技术,结合PostgreSQL的稳定性和扩展性,为微服务架构提供高效的服务发现和配置管理解决方案。

k5l6m的博客 282

开源 java android app 开发(七)通讯之Tcp和Http

本文记录了作者从嵌入式软件开发转向Android应用开发的经历,重点介绍了使用Java进行Android开发的学习过程。文章详细描述了开发环境的搭建、工程文件结构、GUI界面布局、文件和数据库存储、多媒体使用等关键步骤,并特别强调了网络通讯协议(如TCP和HTTP)在Android应用中的实际应用。作者通过代码示例展示了如何实现TCP客户端与服务器的通信以及HTTP请求的处理,包括权限配置、界面设计和代码实现。此外,文章还探讨了Android网络安全配置的相关问题,并提供了解决方案。通过这些内容,作者希望记

ajassi2000的博客 1307

攻防世界 web高手进阶区 9分题 Web_python_flask_sql_injection

继续ctf的旅程,开始攻防世界web高手进阶区的9分题,本文是Web_python_flask_sql_injection的writeup

闵行小鱼塘 1473

ES8311音频Codec避坑指南:从I2C通信、电平匹配到回环测试的保姆级调试笔记

本文详细解析了ES8311音频编解码芯片的调试全流程,涵盖I2C通信建立、电平匹配、主从模式配置等关键环节。通过真实案例和实用技巧,帮助工程师快速定位和解决音频Codec常见问题,提升硬件调试效率。特别针对回环测试、功耗分析等高频故障点提供了可复用的排查方法论。

weixin_42532938的博客 275

Android详细开发教程,本文章将带你更深入的学习安卓开发

安卓开发是一项充满挑战和乐趣的技能,它可以让你创建各种类型的移动应用,从简单的工具到复杂的游戏,本文章将为你提供一个详细的学习路线,参考内容,应用场景,实用案例及代码示例,以及一些优秀的GitHub开源项目,帮助你深入掌握安卓开发!

HSX的博客 4719

【软件逆向】带壳带反调试找flag教程(VMProtect3.0+X64dbg+ScyllaHide)

【软件逆向】带壳带反调试找flag教程(VMProtect 3.0+X64dbg+ScyllaHide)

zhangjiuding的博客 7509

抖音无水印批量下载:3 种任务的完整操作指南

你想把某位博主主页的作品完整存档,或者把刷到的抖音视频存成无水印文件?douyin-downloader 就是干这个的:一个用 Python 写的抖音无水印下载工具,单条视频去水印、整页主页作品批量下载、直播流录制都能覆盖,跑完还有进度展示和自动重试兜底。 ## 先把环境跑起来 准备工作分三步。第一步,从 gitcode 获取代码(仓库地址 https://gitcode.com/GitHub

gitblog_01051的博客 1058

自适应陷波器的原理与实现

x(t)是叠加有两个频率干扰信号的输入信号,s(t)是需要保留的有用信号,在输入信号中,我们只知道频率w1和w2,但不知道信号的幅度A和相位θ,自适应陷波器可以估计两个未知的幅度和相位值,这需要我们提供两路相互正交的单频信号,如cos(w1t)、sin(w1t),通过调整其权值,从而合成出与干扰信号完全相同的信号A1cos(w1t+θ1),从而实现干扰信号的滤除。采用LMS算法,在保证不损失其他有用信号的情况下,有效地抑制输入信号中某一频率的干扰,如需滤除多个频率,只需要增加相应的输入信号。

Melkiades2333的博客 6885

AI自瞄原理剖析(一)屏幕内容循环截取及代码实现

尽管Yolo框架在推理时其实是可以输入不同大小的图片的,但这些作者大多不会去处理图像尺寸的改变,所以目前大部分开源源码主要是以输入320或者640尺寸的图像为主。只要截图的效率足够快,能够满足一秒采集60张图片,也就是稳定的截图速度达到60帧以上,那么就可以实现内存级别的AI锁死自瞄效果。这里强调了截图速度对于最终实现特定自瞄效果的重要性,只有达到这样的速度标准,才能让整个自瞄相关的功能在内存层面有效地运作起来。在实现自瞄功能的情境下,只需要以游戏准星为中心向外的正方形区域图像就够了,没必要进行全屏截取。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 1096

开源 java android app 开发(八)通讯之Mqtt和Ble

本文记录了作者从嵌入式软件开发转向Android应用开发的学习经历,重点介绍了使用Java进行Android开发的关键步骤和技术要点。文章详细描述了开发环境的搭建、工程文件结构、GUI界面布局、常用组件、文件与数据库存储、多媒体使用等内容。特别强调了MQTT和BLE通讯协议的实现,包括MQTT服务器的连接、消息的发送与接收,以及BLE设备的搜索与连接。通过代码示例和配置说明,作者分享了实际开发中的经验与技巧,旨在帮助读者快速掌握Android应用开发的核心技术。

ajassi2000的博客 1047

龙芯2K1000 OTG双模驱动深度解析

是Synopsys公司开发的USB 2.0 OTG控制器IP核,龙芯2K1000内置该IP,作为唯一的OTG控制器(PCI Dev4 Func0),物理基地址0x40000000。核心能力:同时支持Host主机模式(接U盘/键盘)、Device设备模式(虚拟串口ttyGS0)、OTG双模自动切换速率驱动路径:内核源码PMON:启用otg0设备树内核:开启HOSTPERIPHERALG_SERIAL启动参数脚本:sysfs角色切换+开机自启Host按以上配置,龙芯2K1000 DWC2 OTG可完美实现。

weixin_44932366的博客 376

苹果APP和安卓APP开发有哪些不同

苹果(iOS)和安卓(Android)APP 开发的核心差异,本质是“封闭生态 vs 开放生态”导致的技术选型、开发规范、工具流程等一系列区别,最终影响开发效率、适配难度和发布门槛。对比维度iOS 开发Android 开发主要发布渠道唯一官方渠道:App Store(全球统一);内测:TestFlight(最多支持 10000 名测试用户)多渠道发布:国内(华为 / 小米 / OPPO / 应用宝等数十个渠道)、海外(Google Play);内测:蒲公英、fir.im 等第三方平台审核周期。

2501_94331842的博客 1257

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

开源 java android app 开发(九)后台之线程和服务

本文记录了Java开发Android App学习经历,重点讲解了后台程序的实现。主要内容包括: 线程与通讯 - 使用Thread、Handler和Looper实现后台线程与主线程通信,通过示例展示了进度条更新功能 服务Service - 详细介绍了Service的创建、绑定及使用方法,包括: Service生命周期管理 Activity与Service的绑定通信 后台任务处理机制 文章提供了完整的代码示例,涵盖XML布局文件、Service实现和Activity交互,适合Android初学者学习后台开发技术

ajassi2000的博客 835

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

开源 java android app 开发(十一)调试、发布

本文记录了一个嵌入式开发人员转学Android应用开发的经历,主要介绍了使用手机调试和生成APK安装包的方法。调试部分详细说明了如何开启手机开发者选项和USB调试模式。APK生成部分则讲解了编译流程和输出文件位置。文章还列出了完整的Java Android开发学习系列链接,涵盖环境搭建、GUI设计、数据存储、网络通讯等核心内容,并推荐了相关的C#.NET开发教程。这些技术笔记既是对学习过程的总结,也为其他开发者提供了实用参考。

ajassi2000的博客 682

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

开源 java android app 开发(十)广播机制

本文记录了Android应用开发中广播机制的学习过程,主要包含两部分内容:一是两个APP之间的广播通讯实现,通过自定义广播发送方(APP1)和接收方(APP2)展示了Intent发送、BroadcastReceiver注册以及跨进程消息传递;二是基于Service和广播机制的网络文件下载系统,使用OkHttp实现带进度显示的APK下载功能,通过广播更新UI进度条,并处理文件存储权限和下载管理。文中详细提供了XML布局、Java代码实现及权限配置,涵盖了广播注册/注销、服务绑定、线程间通信等关键技术点,最后展

ajassi2000的博客 949

java毕设安卓基于安卓Java的题库app(开题+源码)

首先,该App能够为学生提供丰富的题库资源,满足其多样化的学习需求,有助于提高学生的自主学习能力和学习效果。通过基于安卓Java的题库App,学生可以随时随地进行自主学习和练习,教师可以方便地进行题目管理和更新,实现教育资源的有效利用和共享。在实现这些功能的过程中,我们将注重用户体验的优化,采用简洁明了的界面设计,提高系统的稳定性和响应速度。通过本研究的开展,我们将构建一个功能丰富、操作便捷的基于安卓Java的题库App,为移动学习领域的发展提供有力支持,推动教育信息化的进程。

便捷程序设计 1133

开源项目:购物安卓应用开发教程

开源项目:购物安卓应用开发教程 项目介绍 本项目是由 GitHub 用户 i-vishi 提供的一个名为 "shopping-android-app" 的开源安卓应用程序示例。该应用旨在展示如何构建一个基本的电商应用,包括商品浏览、搜索、添加到购物车等功能。它对于学习Android应用开发,尤其是电商应用界面设计和功能实现的新手开发者而言,是一个宝贵的资源。 仓库链接: ht...

gitblog_00038的博客 1314

开源 java android app 开发(四)GUI界面重要组件

本文记录了作者从嵌入式软件开发转向Android应用开发的学习经历,重点介绍了在Java环境下使用Android Studio开发应用时涉及的三个重要GUI组件:TabLayout、RecyclerView和BottomNavigationView。TabLayout用于分页显示,RecyclerView用于列表显示并支持点击事件,BottomNavigationView用于底部导航栏。文章详细描述了每个组件的实现步骤,包括创建布局文件、活动代码、适配器以及如何在主活动中集成这些组件。通过具体的代码示例和操

ajassi2000的博客 911

开源 java android app 开发(二)工程文件结构

本文记录了作者从嵌入式软件开发转向Android应用开发的经历,重点介绍了Android应用开发中的主要文件和文件夹结构。文章详细描述了权限文件(AndroidManifest.xml)的配置,包括权限管理和界面设置,如横屏显示和隐藏标题栏。此外,还介绍了界面文件夹(XML文件用于GUI设计)、活动文件夹(Java文件,主活动开始执行点)和资源文件夹(包含图片、图标、颜色、字符串等资源)。这些内容旨在帮助开发者快速定位和管理应用开发中的关键组件和资源。

ajassi2000的博客 532

基于安卓的酒店管理APP(源码+定制+开发)

Java全栈专家阿龙提供定制化毕业设计服务 摘要:本文介绍了Java技术专家阿龙的专业背景和服务内容。作为优快云特邀作者和博客专家,阿龙专注于SpringBoot、Vue、MySQL等技术的开发与教学,提供从开题到答辩的全流程毕业设计辅导。服务内容包括系统功能设计、代码实现、论文撰写及降重等,支持腾讯会议一对一讲解。文章详细讲解了Java、MySQL、SpringBoot等技术特点,并展示了会费管理系统的核心代码实现。通过测试用例验证了系统可靠性,为计算机专业学生提供专业的技术支持解决方案。 (字数:14

程序员阿龙的博客 920

基于java+springboot的安卓的健身记录APP系统

基于 Java+SpringBoot 的安卓健身记录 APP 系统,为健身之旅保驾护航。 用户登录后可定制专属健身计划,按计划记录训练详情,如力量训练的重量、组数、次数,有氧运动的时长、速度等。饮食记录板块能添加每日餐饮信息,分析营养成分,对比摄入与消耗热量。身体数据追踪可定期录入体重、体脂率等,以图表呈现变化趋势,直观反映健身成效。社交互动功能方便用户与好友分享健身成果、交流经验心得,互相激励。 技术层面,SpringBoot 后端处理核心业务逻辑与数据存储交互,结合 MySQL 存储用户数据、训练记录等

QQ3359892174的博客 711

(课程设计)基于Android的订餐app 毕业设计-附源码190711

台采用java语言、springboot框架,它是应用mysql数据库、Android等技术动态编程以及数据库进行努力学习和大量实践,并运用到了APP的建设中在整个系统的设计当中,具体根据网上订餐app的现状来进行开发的,具体根据用户需求实现网上订餐app网络化的管理,各类信息有序地进行存储,进入订餐app页面之后,方可开始操作主控界面,系统功能包括管理员服务端:首页、轮播图、公告栏、管理员、美食资讯、资讯分类、外卖商城列表、分类列表、订单列表、店铺展示、卖家、店铺分类、城市管理、订单配送、菜品收入、等功能

ID3461074420的博客 1万+

【亲测免费】 安卓app开发期末大作业资源文件:助你掌握安卓开发核心技能

安卓app开发期末大作业资源文件:助你掌握安卓开发核心技能 【下载地址】安卓app开发期末大作业资源文件 这是一个安卓应用开发的期末大作业资源包,包含了完整的源代码、资源文件和相关文档,非常适合学习、研究和参考。通过该项目,你可以深入了解安卓应用开发的全流程,掌握从代码编写到资源管理的核心技能。无论是初学者还是有一定经验...

gitblog_06716的博客 484

开源 java android app 开发(十二)封库.aar

本文记录了Java Android开发中打包封库的过程,主要解决两种情况:1)简化编译流程时封装不需修改的代码;2)提供SDK时保护源码。通过创建Library模块(包含AddFun和MulFun两个计算类),修改build.gradle开启代码混淆生成.aar库文件。测试工程通过修改gradle配置引入该库,在MainActivity成功调用库中的加减法功能并输出结果,验证了.aar库的有效性。该方案既能提高开发效率,又能实现代码保护。(149字)

ajassi2000的博客 1254
上一篇: 开源 java android app 开发(四)GUI界面重要组件
下一篇: 开源 java android app 开发(六)多媒体使用
ajassi2000
博客等级 码龄22年 2033粉丝 191原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值