Фух. Наконец то проспался и понял как сделать.
Нужно просто поставить Alarm еще раз, напр. чтобы выполнился через 3 секунды. (неудобный, есть вероятность попасть на ошибку)
просто вызвать его в Broadcast после Activity . (не всегда работает)
Запустить Activity и в BroadcastReceiver подождать 8 секунд, а затем там же снять WakeLock.
Это вариант работает прекрасно.
Также с этим кодом Alarm срабатывает если Activity уже запущено либо в фоне. Нужно перехватывать WillBecomeForeground, BecameActive и там включать экран. Процессор включается в WakeLock, но не на долго, вам нужно включить экран при помощи функции ниже, сделать работу затем отключить экран).
В моем случае, в отдельном потоке крутиться самописный планировщик, для других задач, который возбуждает события, по нему я и включаю\отключаю экран.
Итак выстраданный бесcонными ночами Java код, обратите внимание на TestLauncher.putExtra("StartedFromAM", true), это чтобы знать из Activity что запустились из Broadcast (предложенный Blong'гом EXTRA_ALARM_COUNT с BroadcastReceiver всегда вернет ноль, он работает только если запускать напрямую Activity!) :
package com.TestReceiver;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.PowerManager;
import android.os.Handler;
public class AlarmReceiver extends BroadcastReceiver {
private static PowerManager.WakeLock mWakeLock;
@Override
public void onReceive(Context context, Intent intent) {
if (mWakeLock == null) {
PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
mWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "Delphi");
mWakeLock.acquire();
}
Intent TestLauncher = new Intent();
TestLauncher.setClassName(context, "com.embarcadero.firemonkey.FMXNativeActivity");
TestLauncher.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_NEW_TASK); // I
TestLauncher.putExtra("StartedFromAM", true);
context.startActivity(TestLauncher);
//
Handler h = new Handler();
h.postDelayed(new Runnable(){
public void run(){
mWakeLock.release();
mWakeLock = null;
}
}, 8000);
//Toast.makeText(context, "Reelase! ("+mcounter.toString()+")", Toast.LENGTH_SHORT).show(); // For example
}
}
PARTIAL_WAKE_LOCK означает что процессор во время выполнения этого кода, не будет уходить в спящий режим.
Теперь в OnCreate нашей формы добавляем флаги чтобы включить экран, но при условии что запустились мы из AlarmManager :
function StartedFromAlarmManager: boolean;
begin
{$IFDEF ANDROID}
Result := TAndroidHelper.Activity.getIntent.getBooleanExtra(StringToJString('StartedFromAM'), false);
// this will work only if using Activity instead of Broadcast - TJPendingIntent.JavaClass.getActivity:
// Result := TAndroidHelper.Activity.getIntent.getIntExtra(TJIntent.JavaClass.EXTRA_ALARM_COUNT, 0);
{$ELSE}
Result := false;
{$ENDIF}
end;
{$IFDEF ANDROID}
procedure TurnOnAndKeepScreenAndroid(aEnable: boolean);
var
vFlags: integer;
begin
vFlags := TJWindowManager_LayoutParams.JavaClass.FLAG_TURN_SCREEN_ON or
TJWindowManager_LayoutParams.JavaClass.FLAG_DISMISS_KEYGUARD or
TJWindowManager_LayoutParams.JavaClass.FLAG_SHOW_WHEN_LOCKED or
TJWindowManager_LayoutParams.JavaClass.FLAG_KEEP_SCREEN_ON;
if aEnable then
begin
CallInUIThread ( // uses FMX.Helpers.Android
procedure
begin
TAndroidHelper.Activity.getWindow.setFlags (vFlags, vFlags);
end );
end
else
CallInUIThread (
procedure
begin
TAndroidHelper.Activity.getWindow.clearFlags (vFlags);
end );
end;
{$ENDIF}
И сразу же отключаем наш WakeLock устанавливая второй раз Alarmmanager на срабатывание через 3 сек (соответственно запуститься BroadcastReceiver и освободит WakeLock). (уже отключается сам в Broadcast сразу после старта Activity)- т.к. во флагах окна, уже указан FLAG_KEEP_SCREEN - это будет держать экран и систему включенной.
Не забудьте поставить разрешение WAKE LOCK = true!
в принципе это обычная практика когда меняешь стандартные компоненты, складывать модули которые не могут собраться рядом с измененным исходником. то есть ругается на Fmx.Bind.Editors берешь его и кидаешь рядом с FMX.ListView.pas, и так далее.
версия для берлина
Раскраска ListView
Кастомный цвет для определенного Item'a
Отступы для разделителей
Определение Index'a верхнего Item'a
Кол-во видимых элементов
Показано как можно реализовать интерфейс день/ночь
ModernListView.rar
весь код для отрисовки кастомного цвета
1) копируем себе и открываем FMX.ListView
2) Ctrl+F -> DrawItemsFill
3) Вставляем код
// отрисовываем кастомный цвет...........................................
// procedure TListViewBase.DrawItemsFill(const StartItem.................
if TListViewItem(ListItem).Data['aUseCustomColor'].AsBoolean then
FBrush.Color := TListViewItem(ListItem).Data['aCustomColor'].AsInteger;
// ......................................................................
после
if FAlternatingColors and (AltIndex mod 2 = 1) then
FBrush.Color := FItemStyleFillAltColor;
4) Подключаем в своём проекте после стандартного FMX.ListView
Привет Всем!
Много тем на форуме про раскраску TListView, нашел в интернете решение и доработал его
Вот что получилось
LV_Helper.zip ColorListView.zip
Доступно для Seattle
ListView1.SetColorItemSelected(TAlphaColorRec.Orangered); //выделенный
ListView1.SetColorItemFill(TAlphaColorRec.Gray); // обычный цвет Item
ListView1.SetColorItemFillAlt(TAlphaColorRec.Lightgrey); // альтернативный цвет Item
ListView1.SetColorBackground(TAlphaColorRec.Black); // цвет самого TListView
ListView1.SetColorItemSeparator(TAlphaColorRec.Lightgray); // Линия разделения Item'ов
ListView1.SetColorText(TAlphaColorRec.Red); // Обычный текст
ListView1.SetColorTextSelected(TAlphaColorRec.White); // выделенный текст
ListView1.SetColorTextDetail(TAlphaColorRec.Yellow); // текст доп. инфы
ListView1.SetColorTextHeader(TAlphaColorRec.Green); // текст заголовка
ListView1.SetColorTextHeaderShadow(TAlphaColorRec.Lightgray); // тень текста
ListView1.SetColorButtonText(TAlphaColorRec.Orange); // цвет текста кнопки
ListView1.SetColorButtonTextPressed(TAlphaColorRec.Orangered); // цвет нажатой кнопки
добавлено в Berlin
ListView1.SetColorPullRefresh(TAlphaColorRec.Orange);
ListView1.SetColorPullRefreshIndicator(TAlphaColorRec.Orangered);
ListView1.SetColorStretchGlow(TAlphaColorRec.Lime);
ModernListView.rar