极客SJ-鸿蒙Next应用开发训练营2期3期

251 阅读6分钟

在鸿蒙(HarmonyOS)应用开发中,文件操作、本地代码(NDK)集成以及应用通知是构建功能完善应用的几个重要方面。

有讠果: Ukoou·ㄷㅁΜ

2. 鸿蒙文件操作与分享

2.1 文件操作基础

鸿蒙提供了多种API用于文件操作,包括创建、读取、写入和删除文件。常用的类和接口包括:

  • java.io.File: 用于表示文件或目录路径,可以创建、删除文件或目录。
  • java.io.FileInputStream: 用于读取文件内容。
  • java.io.FileOutputStream: 用于写入文件内容。
  • java.io.BufferedReader: 用于高效读取文本文件。
  • java.io.BufferedWriter: 用于高效写入文本文件。

示例:写入文件

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

public class FileUtils {
    public static void writeFile(String filePath, String content) {
        File file = new File(filePath);
        try (FileOutputStream fos = new FileOutputStream(file)) {
            fos.write(content.getBytes());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

示例:读取文件

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.stream.Collectors;

public class FileUtils {
    public static String readFile(String filePath) {
        File file = new File(filePath);
        try (BufferedReader br = new BufferedReader(new FileReader(file))) {
           return br.lines().collect(Collectors.joining(System.lineSeparator()));
        } catch (IOException e) {
            e.printStackTrace();
            return null;
        }
    }
}

2.2 极客鸿蒙Next应用开发训练营2025-存储权限与路径

在鸿蒙中,访问文件需要相应的权限。常用的权限包括:

  • ohos.permission.READ_MEDIA: 读取媒体文件。
  • ohos.permission.WRITE_MEDIA: 写入媒体文件。
  • ohos.permission.READ_USER_STORAGE: 读取用户存储空间。
  • ohos.permission.WRITE_USER_STORAGE: 写入用户存储空间。

鸿蒙文件路径分为:

  • 应用私有目录: 应用只能访问自己创建的文件,通常用于存储应用的数据。

  • 公共目录: 允许应用与其他应用共享文件,例如图片、视频等。

    使用context.getFilesDir()获取应用私有目录,使用context.getExternalFilesDir()获取公共目录。

2.3 文件分享

鸿蒙提供了多种方式进行文件分享,包括:

  • Intent: 使用 Intent 启动其他应用来处理文件,例如分享到微信、QQ等。
  • DataAbility: 通过 DataAbility 将文件暴露给其他应用,实现跨应用共享。
  • ShareHelper: 鸿蒙提供的共享助手,可以方便地进行文件共享。

示例:使用Intent分享

import ohos.aafwk.ability.Ability;
import ohos.aafwk.content.Intent;
import ohos.aafwk.content.Operation;
import ohos.bundle.ElementName;
import ohos.global.resource.RawFileDescriptor;
import java.io.File;

public class ShareUtils {
    public static void shareFile(Ability ability, String filePath) {
        File fileToShare = new File(filePath);
        Intent intent = new Intent();
        Operation operation = new Intent.OperationBuilder()
           .addFlags(Intent.FLAG_NOT_OHOS_COMPONENT)
            .withAction(Intent.ACTION_SEND)
            .withType("application/*")
            .build();
        intent.setOperation(operation);
        try {
             RawFileDescriptor rawFileDescriptor = ability.getAbilityContext().getRawFileDescriptor(fileToShare);
            intent.setUri(rawFileDescriptor.getUri());

        }catch (Exception e){
            e.printStackTrace();
        }
        ability.startAbility(intent);
    }
}

3. 极客鸿蒙Next应用开发训练营2期-鸿蒙NDK开发

3.1 NDK简介

NDK (Native Development Kit) 允许开发者使用C或C++代码来开发鸿蒙应用。NDK通常用于执行计算密集型任务、访问硬件资源以及提高应用性能。

3.2 NDK环境搭建

  1. 安装NDK: 下载并安装鸿蒙的NDK工具链。
  2. 配置项目: 在应用的build.gradle文件中配置NDK编译参数。
  3. 创建JNI桥接类: 创建Java类,用于调用本地代码。
  4. 编写本地代码: 使用C或C++编写本地代码,并生成动态链接库(.so文件)。
  5. 加载库文件: 在Java代码中加载本地库文件。

示例:创建简单的本地方法

  1. 创建JNI桥接类 NativeLibrary.java:
public class NativeLibrary {
    static {
        System.loadLibrary("native"); // 加载本地库
    }
    public native String stringFromJNI(); // 本地方法声明
}
  1. 编写本地代码 native.c:
#include <jni.h>
#include <string.h>

JNIEXPORT jstring JNICALL
Java_com_example_myapplication_NativeLibrary_stringFromJNI(JNIEnv *env, jobject thiz) {
    return (*env)->NewStringUTF(env, "Hello from C++");
}
  1. 在UIAbility中使用:
import com.example.myapplication.NativeLibrary;
import ohos.aafwk.ability.Ability;
import ohos.aafwk.content.Intent;
import ohos.agp.components.Text;
import ohos.agp.window.service.Window;

public class MainAbility extends Ability {
    @Override
    public void onStart(Intent intent) {
        super.onStart(intent);
         super.setUIContent(ResourceTable.Layout_ability_main);
        NativeLibrary nativeLib = new NativeLibrary();
        String nativeString = nativeLib.stringFromJNI();
        Text text = (Text) findComponentById(ResourceTable.Id_text);
        text.setText(nativeString);
    }
}

3.3 NDK开发注意事项

  • 避免内存泄漏: 在C/C++代码中,需要手动管理内存,避免内存泄漏。
  • 线程安全: 如果在本地代码中使用了多线程,需要注意线程安全问题。
  • 性能测试: 对本地代码进行性能测试,找出性能瓶颈并进行优化。
  • 调试: 使用NDK调试工具进行调试,例如GDB。

4. 鸿蒙应用通知与提醒

4.1 通知系统

鸿蒙提供了NotificationHelper类用于创建和管理应用通知。通知可以显示在状态栏或通知中心,用于提醒用户应用的重要事件。

4.2 创建通知

创建通知需要以下几个步骤:

  1. 创建NotificationRequest: 设置通知的标题、内容、图标、点击事件等。
  2. 发布通知: 使用 NotificationHelper.publishNotification 发布通知。

示例:创建简单的通知

import ohos.aafwk.ability.Ability;
import ohos.aafwk.content.Intent;
import ohos.agp.components.Button;
import ohos.eventhandler.EventHandler;
import ohos.eventhandler.EventRunner;
import ohos.eventhandler.InnerEvent;
import ohos.notification.NotificationHelper;
import ohos.notification.NotificationRequest;
import ohos.notification.common.RemoteObject;

public class MainAbility extends Ability {
    private static final int NOTIFICATION_ID = 1001;
    private EventHandler handler;

    @Override
    public void onStart(Intent intent) {
        super.onStart(intent);
        super.setUIContent(ResourceTable.Layout_ability_main);
         Button button = (Button) findComponentById(ResourceTable.Id_button);

        EventRunner runner = EventRunner.create("NotificationRunner");
        handler = new EventHandler(runner) {
            @Override
            protected void processEvent(InnerEvent event) {
                if (event.eventId == 0) {
                  showNotification();
                }
            }
        };
        button.setClickedListener(component -> {
            handler.sendEvent(0);
        });

    }


    private void showNotification() {
        NotificationRequest request = new NotificationRequest(NOTIFICATION_ID);
        request.setTapAction(new RemoteObject(""));
        request.setTitle("My Application");
        request.setContentText("You have a new message!");
        NotificationHelper.publishNotification(request);
    }
}

4.3 通知渠道

为了更好地管理通知,鸿蒙引入了通知渠道的概念。通知渠道允许用户对不同类型的通知进行分类管理。

  1. 创建通知渠道: 使用 NotificationHelper.createNotificationChannel 创建通知渠道。
  2. 设置通知渠道: 在发布通知时,将 NotificationRequest 设置为指定的通知渠道。

4.4 通知提醒类型

鸿蒙支持多种通知提醒类型:

  • 普通通知: 仅显示在通知栏中。
  • 横幅通知: 在屏幕顶部弹出显示。
  • 锁屏通知: 在锁屏界面显示。
  • 悬浮通知: 在屏幕上方悬浮显示。

4.5 应用通知的注意事项

  • 用户许可: 需要在应用的config.json文件中声明权限,并请求用户授予通知权限。
  • 通知频率: 避免过度发送通知,影响用户体验。
  • 通知内容: 确保通知内容准确、简洁,并对用户有价值。

5. 进阶技巧

5.1 使用JobScheduler进行后台任务

鸿蒙提供了 JobScheduler API,用于在后台执行任务,例如文件上传、数据同步等。JobScheduler 可以根据网络状态、电量等条件,智能地调度后台任务。

5.2 使用DataAbility进行跨应用数据共享

DataAbility 允许应用安全地与其他应用共享数据,包括文件、数据库等。可以创建自定义的 DataAbility,暴露应用的数据,供其他应用使用。

5.3 使用AIDL进行跨进程通信

AIDL(Android Interface Definition Language) 也可以用于鸿蒙的跨进程通信,定义接口,用于不同进程之间的消息传递。

6. 案例演示

我们将通过一个简单的例子来演示鸿蒙的文件操作、NDK开发和应用通知功能。

  • 场景: 一个应用,点击按钮,写入文件,调用NDK方法获得字符串,然后显示在TextView,同时发送一个通知。
  • 步骤:
    1. UIAbility的布局文件中创建一个TextView和一个Button
    2. UIAbilityonStart方法中,获取TextViewButton的实例。
    3. Button设置点击事件监听。
    4. 在点击事件中,调用FileUtilswriteFile方法写入文件。
    5. 调用NativeLibrarystringFromJNI方法获取字符串。
    6. 将字符串显示在TextView上。
    7. 调用NotificationHelper.publishNotification发布通知。