德尔福XE5的Android。如何使用PowerManager.WakeLock? [英] Delphi XE5 Android. How to use PowerManager.WakeLock?
问题描述
我想保存在设备上,避免从内存中卸载我的应用程序即使没有用户活动。类似的服务。我做了模块像<一个href="http://stackoverflow.com/questions/18888345/how-to-check-if-network-is-available-on-android-delphi-xe5">How检查网络在Android(德尔福XE5)但是当我运行SetWakeLock系统击碎:
单元Android.PowerManager;
接口
功能SetWakeLock:布尔;
程序ReleaseWakeLock;
履行
用途
System.SysUtils,
Androidapi.JNI,
Androidapi.JNIBridge,
Androidapi.JNI.GraphicsContentViewText,
Androidapi.JNI.JavaTypes,
FMX.Helpers.Android;
类型
JPowerManager =接口;
JWakeLock =接口;
JWakeLockClass =接口(JObjectClass)
['{4CF7A13D-15A9-4DEE-8CA7-66600C188CB7}']
结束;
[JavaSignature('机器人/ OS /电源管理器/ WakeLock')]
JWakeLock =接口(JObject)
['{55983EDC-782F-490A-BF0C-12207EB7829E}']
{}方法
程序获取; CDECL;
程序释放; CDECL;
功能isHeld:布尔; CDECL;
结束;
TJWakeLock =类(TJavaGenericImport&LT; JWakeLockClass,JWakeLock&GT;)结束;
JPowerManagerClass =接口(JObjectClass)
['{B127DD4E-1DA6-49E7-98BA-5966DC7E26FA}']
结束;
[JavaSignature('机器人/ OS /电源管理器')]
JPowerManager =接口(JObject)
['{241C3B3D-3DF0-489B-A33E-3CD7F5D26313}']
{}方法
功能newWakeLock(levelAndFlags:整数;标签:的jstring):JWakeLock; CDECL;
结束;
TJPowerManager =类(TJavaGenericImport&LT; JPowerManagerClass,JPowerManager&GT;)结束;
功能GetPowerManager:JPowerManager;
变种
PowerServiceNative:JObject;
开始
PowerServiceNative:= SharedActivityContext.getSystemService(TJContext.JavaClass.POWER_SERVICE);
如果未分配(PowerServiceNative),然后
提高Exception.Create(无法找到电力服务');
结果:= TJPowerManager.Wrap(
(PowerServiceNative为ILocalObject).GetObjectID);
如果未分配(结果),那么
提高Exception.Create(无法访问电源管理);
结束;
VAR fWakeLock:JWakeLock =零;
功能SetWakeLock:布尔;
变种
电源管理器:JPowerManager;
开始
结果:= fWakeLock&LT;&GT;零;
如果结果然后开始
电源管理器:= GetPowerManager;
fWakeLock:= PowerManager.newWakeLock(1,StringToJString('VC')); // PARTIAL_WAKE_LOCK = 1
结果:= fWakeLock&LT;&GT;零;
如果结果然后开始
fWakeLock.acquire;
结果:= fWakeLock.IsHeld;
结束;
结束否则,如果没有fWakeLock.IsHeld话
fWakeLock.acquire;
结束;
程序ReleaseWakeLock;
开始
如果fWakeLock&LT;&GT;零,然后开始
fWakeLock.release;
结束;
结束;
结束。
忽略,我引用的注释错了前瞻性的逻辑,你是不是指嵌套类正确的接口声明。
本机适用于我。请注意我用的屏幕唤醒锁(这是德precated,但仍然有效)。
单元Android.JNI.PowerManager;
接口
功能AcquireWakeLock:布尔;
程序ReleaseWakeLock;
履行
用途
System.SysUtils,
Androidapi.JNI,
Androidapi.JNIBridge,
Androidapi.JNI.GraphicsContentViewText,
Androidapi.JNI.JavaTypes,
FMX.Helpers.Android;
类型
JPowerManager =接口;
JWakeLock =接口;
JWakeLockClass =接口(JObjectClass)
['{918E171F-CDB8-4464-9507-F49272CE7636}']
结束;
[JavaSignature('机器人/ OS /电源管理器$ WakeLock')]
JWakeLock =接口(JObject)
['{D17B1136-FA15-4AEB-85B1-2D490F0FD320}']
{}方法
程序获取; CDECL;
程序释放; CDECL;
功能isHeld:布尔; CDECL;
结束;
TJWakeLock =类(TJavaGenericImport&LT; JWakeLockClass,JWakeLock&GT;)结束;
JPowerManagerClass =接口(JObjectClass)
['{7D0696A2-ADEA-4158-AE1F-5E720DEDBCF9}']
{属性方法}
功能_GetFULL_WAKE_LOCK:整数; CDECL;
功能_GetSCREEN_BRIGHT_WAKE_LOCK:整数; CDECL;
功能_GetSCREEN_DIM_WAKE_LOCK:整数; CDECL;
功能_GetPARTIAL_WAKE_LOCK:整数; CDECL;
{}属性
//保持屏幕上的明亮和放大器;键盘上
//德precated在API级别17 - 果冻豆MR1
物业FULL_WAKE_LOCK:整数读_GetFULL_WAKE_LOCK;
//保持屏幕上亮
//德precated在API级别13 - 蜂窝MR2
物业SCREEN_BRIGHT_WAKE_LOCK:整数读_GetSCREEN_BRIGHT_WAKE_LOCK;
//保持屏幕暗淡
//德precated在API级别17 - 果冻豆MR1
物业SCREEN_DIM_WAKE_LOCK:整数读_GetSCREEN_DIM_WAKE_LOCK;
//保持CPU的运行,画面+键盘可以熄灭
物业PARTIAL_WAKE_LOCK:整数读_GetPARTIAL_WAKE_LOCK;
结束;
[JavaSignature('机器人/ OS /电源管理器')]
JPowerManager =接口(JObject)
['{DEAED658-4353-4D17-B0A3-8179E48BE87F}']
{}方法
功能newWakeLock(levelAndFlags:整数;标签:的jstring):JWakeLock; CDECL;
结束;
TJPowerManager =类(TJavaGenericImport&LT; JPowerManagerClass,JPowerManager&GT;)结束;
功能GetPowerManager:JPowerManager;
变种
PowerServiceNative:JObject;
开始
PowerServiceNative:= SharedActivityContext.getSystemService(
TJContext.JavaClass.POWER_SERVICE);
如果未分配(PowerServiceNative),然后
提高Exception.Create(无法找到电力服务');
结果:= TJPowerManager.Wrap(
(PowerServiceNative为ILocalObject).GetObjectID);
如果未分配(结果),那么
提高Exception.Create(无法访问电源管理);
结束;
变种
WakeLock:JWakeLock =零;
功能AcquireWakeLock:布尔;
变种
电源管理器:JPowerManager;
开始
结果:=分配(WakeLock);
如果没有结果,那么
开始
电源管理器:= GetPowerManager;
WakeLock:= PowerManager.newWakeLock(
TJPowerManager.JavaClass.SCREEN_BRIGHT_WAKE_LOCK,
StringToJString(德尔福));
结果:=分配(WakeLock);
结束;
如果结果则
开始
如果没有WakeLock.IsHeld话
开始
WakeLock.acquire;
结果:= WakeLock.isHeld
结束;
结束;
结束;
程序ReleaseWakeLock;
开始
如果分配(WakeLock),然后
开始
WakeLock.release;
WakeLock:=零
结束;
结束;
结束。
I'd like to keep device on and avoid unloading my application from memory even while there is no user activity. Something like service. I made module like How to check if network is available on Android ( Delphi XE5 ) but system crushes when I run SetWakeLock:
unit Android.PowerManager;
interface
function SetWakeLock : boolean;
procedure ReleaseWakeLock;
implementation
uses
System.SysUtils,
Androidapi.JNI,
Androidapi.JNIBridge,
Androidapi.JNI.GraphicsContentViewText,
Androidapi.JNI.JavaTypes,
FMX.Helpers.Android;
type
JPowerManager = interface;
JWakeLock = interface;
JWakeLockClass = interface(JObjectClass)
['{4CF7A13D-15A9-4DEE-8CA7-66600C188CB7}']
end;
[JavaSignature('android/os/PowerManager/WakeLock')]
JWakeLock = interface(JObject)
['{55983EDC-782F-490A-BF0C-12207EB7829E}']
{Methods}
procedure acquire; cdecl;
procedure release; cdecl;
function isHeld: Boolean; cdecl;
end;
TJWakeLock = class(TJavaGenericImport<JWakeLockClass, JWakeLock>) end;
JPowerManagerClass = interface(JObjectClass)
['{B127DD4E-1DA6-49E7-98BA-5966DC7E26FA}']
end;
[JavaSignature('android/os/PowerManager')]
JPowerManager = interface(JObject)
['{241C3B3D-3DF0-489B-A33E-3CD7F5D26313}']
{Methods}
function newWakeLock(levelAndFlags: integer; tag: JString): JWakeLock; cdecl;
end;
TJPowerManager = class(TJavaGenericImport<JPowerManagerClass, JPowerManager>) end;
function GetPowerManager: JPowerManager;
var
PowerServiceNative: JObject;
begin
PowerServiceNative := SharedActivityContext.getSystemService(TJContext.JavaClass.POWER_SERVICE);
if not Assigned(PowerServiceNative) then
raise Exception.Create('Could not locate Power Service');
Result := TJPowerManager.Wrap(
(PowerServiceNative as ILocalObject).GetObjectID);
if not Assigned(Result) then
raise Exception.Create('Could not access Power Manager');
end;
var fWakeLock : JWakeLock = nil;
function SetWakeLock : boolean;
var
PowerManager: JPowerManager;
begin
result := fWakeLock<>nil;
if result then begin
PowerManager := GetPowerManager;
fWakeLock := PowerManager.newWakeLock(1,StringToJString('VC')); //PARTIAL_WAKE_LOCK =1
Result := fWakeLock<>nil;
if Result then begin
fWakeLock.acquire;
Result := fWakeLock.IsHeld;
end;
end else if not fWakeLock.IsHeld then
fWakeLock.acquire;
end;
procedure ReleaseWakeLock;
begin
if fWakeLock<>nil then begin
fWakeLock.release;
end;
end;
end.
Ignoring the wrong-looking logic that I cited in a comment, you're not referring to a nested class correctly in the interface declaration.
This unit works for me. Note I'm using a screen wake lock (which is deprecated, but still works).
unit Android.JNI.PowerManager;
interface
function AcquireWakeLock : Boolean;
procedure ReleaseWakeLock;
implementation
uses
System.SysUtils,
Androidapi.JNI,
Androidapi.JNIBridge,
Androidapi.JNI.GraphicsContentViewText,
Androidapi.JNI.JavaTypes,
FMX.Helpers.Android;
type
JPowerManager = interface;
JWakeLock = interface;
JWakeLockClass = interface(JObjectClass)
['{918E171F-CDB8-4464-9507-F49272CE7636}']
end;
[JavaSignature('android/os/PowerManager$WakeLock')]
JWakeLock = interface(JObject)
['{D17B1136-FA15-4AEB-85B1-2D490F0FD320}']
{Methods}
procedure acquire; cdecl;
procedure release; cdecl;
function isHeld: Boolean; cdecl;
end;
TJWakeLock = class(TJavaGenericImport<JWakeLockClass, JWakeLock>) end;
JPowerManagerClass = interface(JObjectClass)
['{7D0696A2-ADEA-4158-AE1F-5E720DEDBCF9}']
{Property methods}
function _GetFULL_WAKE_LOCK: Integer; cdecl;
function _GetSCREEN_BRIGHT_WAKE_LOCK: Integer; cdecl;
function _GetSCREEN_DIM_WAKE_LOCK: Integer; cdecl;
function _GetPARTIAL_WAKE_LOCK: Integer; cdecl;
{Properties}
//Keep screen on bright & keyboard on
//Deprecated in API level 17 - Jelly Bean MR1
property FULL_WAKE_LOCK: Integer read _GetFULL_WAKE_LOCK;
//Keep screen on bright
//Deprecated in API level 13 - Honeycomb MR2
property SCREEN_BRIGHT_WAKE_LOCK: Integer read _GetSCREEN_BRIGHT_WAKE_LOCK;
//Keep screen on dim
//Deprecated in API level 17 - Jelly Bean MR1
property SCREEN_DIM_WAKE_LOCK: Integer read _GetSCREEN_DIM_WAKE_LOCK;
//Keep CPU running, screen & keyboard can go off
property PARTIAL_WAKE_LOCK: Integer read _GetPARTIAL_WAKE_LOCK;
end;
[JavaSignature('android/os/PowerManager')]
JPowerManager = interface(JObject)
['{DEAED658-4353-4D17-B0A3-8179E48BE87F}']
{Methods}
function newWakeLock(levelAndFlags: Integer; tag: JString): JWakeLock; cdecl;
end;
TJPowerManager = class(TJavaGenericImport<JPowerManagerClass, JPowerManager>) end;
function GetPowerManager: JPowerManager;
var
PowerServiceNative: JObject;
begin
PowerServiceNative := SharedActivityContext.getSystemService(
TJContext.JavaClass.POWER_SERVICE);
if not Assigned(PowerServiceNative) then
raise Exception.Create('Could not locate Power Service');
Result := TJPowerManager.Wrap(
(PowerServiceNative as ILocalObject).GetObjectID);
if not Assigned(Result) then
raise Exception.Create('Could not access Power Manager');
end;
var
WakeLock: JWakeLock = nil;
function AcquireWakeLock: Boolean;
var
PowerManager: JPowerManager;
begin
Result := Assigned(WakeLock);
if not Result then
begin
PowerManager := GetPowerManager;
WakeLock := PowerManager.newWakeLock(
TJPowerManager.JavaClass.SCREEN_BRIGHT_WAKE_LOCK,
StringToJString('Delphi'));
Result := Assigned(WakeLock);
end;
if Result then
begin
if not WakeLock.IsHeld then
begin
WakeLock.acquire;
Result := WakeLock.isHeld
end;
end;
end;
procedure ReleaseWakeLock;
begin
if Assigned(WakeLock) then
begin
WakeLock.release;
WakeLock := nil
end;
end;
end.
这篇关于德尔福XE5的Android。如何使用PowerManager.WakeLock?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!