delphiXE用Android原生方法开发App(一)

一、常用的单元引用

01、uses FMX.Helpers.Android;  //:Android线程与线程池、Android处理其系统内基本的表面绘制、Android数组转化

const
  /// <summary>Minimum base action number for using in Android Intent</summary>
  UserRequestCodeBase = 10;   //:请求Android的Intent,至少被调用的应用内置要有10个Action操作
  
function IsGingerbreadDevice: Boolean;  //:是否为姜黄饼干样的设备:指老掉牙的设备:TOSVersion.Major = 2;

//设置为主题皮肤:0-返回样式描述不成功-代表该窗体中没有样式本TStyleBook或有但未设置:用原生方法将Fmx的样式本设置为主题皮肤:
function GetNativeTheme: Integer; overload; 
function GetNativeTheme(const AControl: TControl): Integer; overload;   //:获取原生主题皮肤

{ 几个处理基本表面绘制的函数:Surface convertions }

function JBitmapToSurface(const SrcBitmap: JBitmap; const DestSurface: TBitmapSurface): Boolean;
function SurfaceToJBitmap(const SrcSurface: TBitmapSurface; const DestBitmap: JBitmap): Boolean;
function NativeViewToSurface(const ANativeView: JView; const ASurface: TBitmapSurface): Boolean;

{ 产生传入Java数组的转化函数:Java array conversion }

function CreateJavaStringArray(const ASource: array of const): TJavaObjectArray<JString>;

{ 用UI线程(即主线程)工作的内容:Work with UI Thread }

  TUIThreadCaller = class  //:线程调用类(匿名方法、异步调用与回调、强制出队)
  TFinishedRunnableCollector = class  //:处理已完成的线程(或任务)的列表容器类

var
  ActiveJavaRunnables: TThreadList<TRunnable>;  //:活动的任务的线程队列列表容器变量:uses System.Generics.Collections;  

 在UI线程中调用“回调事件或回调匿名方法”子线程的几个过程:线程入队-先进先出(非栈模式:进栈压入-后进先出-出栈弹出):

procedure CallInUIThread(AMethod: TMethodCallback); overload;   
procedure CallInUIThread(AMethod: TCallBack); overload;  //: UI线程直接执行被调用的子线程,但暂未释放,等待操作系统自动释放或等待引用窗体Activity被代码disposeof后释放,或UI线程(即主线程)被操作者关闭后自动释放
:异步非阻塞模式的队列线程池模式
procedure CallInUIThreadAndWaitFinishing(AMethod: TMethodCallback); overload;
procedure CallInUIThreadAndWaitFinishing(AMethod: TCallBack); overload;  //: UI线程等待被调用的线程执行完毕,
线程出队出栈弹出:异步非阻塞的队列线程池模式:uses System.SyncObjs; //:其中调用了TEvent事件总线监控:Event.SetEvent;  Event.WaitFor:子线程执行完毕立即释放

initialization
  ActiveJavaRunnables := TThreadList<TRunnable>.Create;  //:初始化:活动的任务的线程列表变量(初始化线程队列容器)  

finalization
  ActiveJavaRunnables.DisposeOf //:释放:活动的任务的线程列表变量(释放线程队列容器,并释放其中的未被释放的子线程-按队列先进先出)  
end.

02、uses Androidapi.JNI.Provider; //:Android的五大存储之四的内容提供者(ContentProvider)及内容接收器(ContentResolver)的处理单元

02.001、应用1:Android安卓系统缩略图内容提供者及内容接收器

  JImages_ThumbnailsClass = interface(JObjectClass)     
  {class} function getThumbnail(cr: JContentResolver; origId: Int64; kind: Integer; options: JBitmapFactory_Options): JBitmap; cdecl; overload;
    {class} function getThumbnail(cr: JContentResolver; origId: Int64; groupId: Int64; kind: Integer; options: JBitmapFactory_Options): JBitmap; cdecl; overload;
    {class} function query(cr: JContentResolver; uri: Jnet_Uri; projection: TJavaObjectArray<JString>): JCursor; cdecl;
    {class} function queryMiniThumbnail(cr: JContentResolver; origId: Int64; kind: Integer; projection: TJavaObjectArray<JString>): JCursor; cdecl;
    {class} function queryMiniThumbnails(cr: JContentResolver; uri: Jnet_Uri; kind: Integer; projection: TJavaObjectArray<JString>): JCursor; cdecl;  
  [JavaSignature('android/provider/MediaStore$Images$Thumbnails')]   //:内容提供者签名共享的URI路径内容
  JImages_Thumbnails = interface(JObject)
    ['{29CB9363-CD45-4C6E-86EF-FD421A2C7A11}']
  end;
  TJImages_Thumbnails = class(TJavaGenericImport<JImages_ThumbnailsClass, JImages_Thumbnails>) end;

delphiXE用Android原生方法开发App(一)

其中:thumbnail_cache路径是用Sqlite本地数据库缓存的,所以本质上是调用存取数据库的操作:

delphiXE用Android原生方法开发App(一)

该数据库的表结构如下:

CREATE TABLE kv(k INTEGER PRIMARY KEY, v BLOB);   

delphiXE用Android原生方法开发App(一)

       因而:介绍完原理之后,最后面就会作为一个案例分析:FMX调用该数据库进行缩略图列表和用Android原生方法列表缩略图的效率比较。

03、uses Androidapi.JNI.Media;  //Android媒体及其处理单元

03.001、应用1:缩略图工具类:

JThumbnailUtilsClass = interface(JObjectClass)
    ['{5D772E54-5912-4CF0-A97D-0A4B171E7EF7}']
    {class} function _GetOPTIONS_RECYCLE_INPUT: Integer; cdecl;  //:获取选项-回收再利用选项
    {class} function init: JThumbnailUtils; cdecl;  //:初始化实例化本工具类
    {class} function createVideoThumbnail(filePath: JString; kind: Integer): JBitmap; cdecl;  //:产生视频缩略图
    {class} function extractThumbnail(source: JBitmap; width: Integer; height: Integer): JBitmap; cdecl; overload;
    {class} function extractThumbnail(source: JBitmap; width: Integer; height: Integer; options: Integer): JBitmap; cdecl; overload;  //:提取缩略图
    {class} property OPTIONS_RECYCLE_INPUT: Integer read _GetOPTIONS_RECYCLE_INPUT;//:回收再利用选项属性
  end;

  [JavaSignature('android/media/ThumbnailUtils')]
  JThumbnailUtils = interface(JObject)
    ['{EF230179-DF54-4876-A9BC-5D982DF95E21}']
  end;
  TJThumbnailUtils = class(TJavaGenericImport<JThumbnailUtilsClass, JThumbnailUtils>) end;

 

附注:转好文章:《Android之四大组件、六大布局、五大存储》

https://blog.csdn.net/shenggaofei/article/details/52450668?depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-13&utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-13

喜欢的话,就在下面点个赞、收藏就好了,方便看下次的分享:

 

相关文章:

  • 2022-01-13
  • 2022-01-05
  • 2021-04-01
  • 2022-12-23
  • 2021-08-01
  • 2021-12-06
  • 2021-09-13
  • 2021-05-12
猜你喜欢
  • 2022-12-23
  • 2021-10-03
  • 2021-06-14
  • 2021-08-22
  • 2021-12-21
  • 2022-12-23
  • 2021-09-05
相关资源
相似解决方案