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;
其中:thumbnail_cache路径是用Sqlite本地数据库缓存的,所以本质上是调用存取数据库的操作:
该数据库的表结构如下:
CREATE TABLE kv(k INTEGER PRIMARY KEY, v BLOB);
因而:介绍完原理之后,最后面就会作为一个案例分析: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之四大组件、六大布局、五大存储》
喜欢的话,就在下面点个赞、收藏就好了,方便看下次的分享: