Я могу настроить приложение для Android для запуска в указанное время с помощью Android AlarmManager. Он работает хорошо, я использовал this руководство и this форум для деталей (используйте переводчик Google).Как передать логическое (или целое) намерение и прочитать его (чтобы обнаружить, что моя активность была запущена из Android AlarmManager)?
Так что я создаю DEX-файл из кода Java (из XE7 вы можете просто attach JAR без создания dex (!)). Для того, чтобы обнаружить, если Мое приложение было начато с AlarmManager я решил поставить булево вар намерению, используя this Java руководство от StackOverflow, так что я добавил в код Java строку:
TestLauncher.putExtra("StartedFromAM", true);
Полный Java-код, который будет скомпилировано jar (или dex):
package com.TestReceiver;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
public class AlarmReceiver extends BroadcastReceiver {
public void onReceive(Context context, Intent intent) {
Intent TestLauncher = new Intent();
TestLauncher.setClassName(context, "com.embarcadero.firemonkey.FMXNativeActivity");
TestLauncher.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
TestLauncher.putExtra("StartedFromAM", true);
context.startActivity(TestLauncher);
}
}
Так что теперь в теории мое намерение имеет аргумент StartedFromAM.
Он компилируется в файл dex, проблема в том, что я не могу прочитать это логическое значение из кода Delphi - он всегда = 0 (false).
Я попытался это:
ShowMessage(SharedActivity.getIntent.getBooleanExtra(StringToJString('StartedFromAM'), false).ToString);
ShowMessage(MainActivity.getIntent.getBooleanExtra(StringToJString('StartedFromAM'), false).ToString);
Update 1
Благодаря г Blong я уже получил правильное решение о том, как определить, что моя деятельность была начата с Android AlarmManager, это обновление только о PutExtra в Java Code и чтении дополнительной ценности от намерения от Delphi. Вы можете пропустить его, если хотите.
Теперь я знаю, что могу подключать файлы JAR (у меня есть Berlin upd 2), без создания dex. Итак, я создал новый файл jar - полный код Java, который я показал выше. Затем я создал новый проект, и установки сигнализации с этим кодом
procedure SetAlarmWakeUpAdnroid(aSeconds: integer);
function getTimeAfterInSecs(Seconds: Integer): Int64;
var
Calendar: JCalendar;
begin
Calendar := TJCalendar.JavaClass.getInstance;
Calendar.add(TJCalendar.JavaClass.SECOND, Seconds);
Result := Calendar.getTimeInMillis;
end;
var
Intent: JIntent;
PendingIntent: JPendingIntent;
vRes: boolean;
begin
Intent := TJIntent.Create;
Intent.setClassName(TAndroidHelper.Context, StringToJString('com.embarcadero.firemonkey.FMXNativeActivity'));
PendingIntent := TJPendingIntent.JavaClass.getActivity(TAndroidHelper.Context, 1, Intent, 0);
TAndroidHelper.AlarmManager.&set(TJAlarmManager.JavaClass.RTC_WAKEUP, getTimeAfterInSecs(30),
PendingIntent);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
SetAlarmWakeUpAdnroid(30);
end;
Затем я добавил OnFormCreate событие
procedure TForm1.FormCreate(Sender: TObject);
begin
ShowMessage('StartedFromAM =' + TAndroidHelper.Activity.getIntent.getBooleanExtra(StringToJString('StartedFromAM'), false).ToString);
ShowMessage('EXTRA_ALARM_COUNT = ' + TAndroidHelper.Activity.getIntent.getIntExtra(TJIntent.JavaClass.EXTRA_ALARM_COUNT, 0).ToString);
end;
Когда менеджер Alarm начал мое приложение, я получил EXTRA_ALARM_COUNT = 1 и StartedFromAM = 0.
Спасибо Блонгу! EXTRA_ALARM_COUNT работает хорошо. Я также попытался поместить Extra из Java Code снова как логическое и целое, с другими именами. Я также удалил этот файл dex из Delphi Deployment> очищенный проект> удаленная папка отладки>, а затем снова создал dex> сборку и развертывание проекта - и до сих пор не смог получить ее из намерения. Возможно, он не добавляет лишние поля или удаляет этот код. Btw Я получил свой класс.dex (от debug classes.dex) размером 2,5 мб (Delphi Berlin update 2). Еще раз спасибо за сообщение об EXTRA_ALARM_COUNT! – alitrun
Ах да, вы создаете файл .dex. Это означает, что вы используете XE6 или, возможно, даже XE5, в крайнем случае. Я добавил примечание об этом, но я считаю, что это сильные разногласия. Я могу сказать, что у меня есть ваш код, работающий в Delphi 10.1 Berlin, с широковещательным приемником в отдельном файле .jar просто отлично - значения помещаются в намерение и проходят, как и ожидалось. Должна быть проблема в том, как вы получаете свой код в .dex или как на dex ссылается Delphi в вашем случае. У меня нет доступа к XE6, но я рад, что у вас есть способ прогресса. – blong
Я могу подключить банку вместо DEX?Это новая информация для меня :) Я использую Delphi Berlin upd 2. И спасибо за Блонга снова, теперь я могу просто соединить банку! :) Btw Я обновил вопрос - я не могу читать boolean от намерения даже с jar на новом проекте с последним Delphi. Но вы можете пропустить этот вопрос, я уже получил ответ - это просто академический интерес. – alitrun