Перейти к содержанию
  • Регистрация
  • 0
serser

Конвертация JParcelable в JPendingIntent

Вопрос

Помогите достать JPendingIntent из JIntent.

Пытаюсь из сервиса получить отложенный интент, созданный с помощью TAndroidHelper.Activity.createPendingResult.

 

Делаю так:

var

  Parcel: JParcelable;
  PIntent: JPendingIntent;

begin

Parcelable := Intent.getParcelableExtra(StringToJString('pendingintent'));

PIntent := Parcelable ;

...

end;

Получается ошибка:

E2010 Incompatible types: 'JPendingIntent' and 'JParcelable'

Как приводить эти интерфейсы друг к другу?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Рекомендуемые сообщения

  • 0
59 минут назад, serser сказал:

Помогите достать JPendingIntent из JIntent.

Пытаюсь из сервиса получить отложенный интент, созданный с помощью TAndroidHelper.Activity.createPendingResult.

 

Делаю так:

var

  Parcel: JParcelable;
  PIntent: JPendingIntent;

begin

Parcelable := Intent.getParcelableExtra(StringToJString('pendingintent'));

PIntent := Parcelable ;

...

end;

Получается ошибка:

E2010 Incompatible types: 'JPendingIntent' and 'JParcelable'

Как приводить эти интерфейсы друг к другу?

 

Проверить возможности нет, но скорее всего

PIntent := JPendingIntent(Parcelable);

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
13 часов назад, mazayhin сказал:

PIntent := JPendingIntent(Parcelable);

 

Получается Segmentation fault

 PIntent  на момент присваивания = nil

И это явно не простое присваивание, потому что во время него 10 раз в логе пишется switching thread, потом появляется эксепшн.

 

Передаю интент в сервис так:

class procedure TssAndroidServiceHelper.StartService(const AServiceName: string; AIntent: JIntent);
var
  PendingIntent: JPendingIntent;
begin
  PendingIntent := TAndroidHelper.Activity.createPendingResult(1, AIntent, 0);

  AIntent.setClassName(TAndroidHelper.Context.getPackageName(),
    TAndroidHelper.StringToJString(AServiceName));

  AIntent.putExtra(StringToJString('q'), JParcelable(PendingIntent));

  TAndroidHelper.Activity.startService(AIntent);
end;

 

Получаю так:

TDM = class(TAndroidService)
    function AndroidServiceStartCommand(const Sender: TObject;
      const Intent: JIntent; Flags, StartId: Integer): Integer;
    procedure AndroidServiceCreate(Sender: TObject);
  private
    FPIntent: JPendingIntent;
    FStr: string;
    FThread: TssThread;
    procedure StartThread;
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
  end;

function TDM.AndroidServiceStartCommand(const Sender: TObject;
  const Intent: JIntent; Flags, StartId: Integer): Integer;
var
  ResultIntent: JIntent;
  Parcelable: JParcelable;
begin
  Parcelable := Intent.getParcelableExtra(StringToJString('q'));
  FPIntent := JPendingIntent(Parcelable);

  ResultIntent := TJIntent.Create;
  ResultIntent.putExtra(StringToJString('res'), StringToJString('content'));
  FPIntent.send(TAndroidHelper.Context, 7, ResultIntent);

  Result := TJService.JavaClass.START_STICKY;
end;

 

Есть еще идеи как вытащить отложенное намерение?

 

Изменено пользователем serser

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
13 часов назад, serser сказал:

 

Получается Segmentation fault

 PIntent  на момент присваивания = nil

И это явно не простое присваивание, потому что во время него 10 раз в логе пишется switching thread, потом появляется эксепшн.

 

Передаю интент в сервис так:


class procedure TssAndroidServiceHelper.StartService(const AServiceName: string; AIntent: JIntent);
var
  PendingIntent: JPendingIntent;
begin
  PendingIntent := TAndroidHelper.Activity.createPendingResult(1, AIntent, 0);

  AIntent.setClassName(TAndroidHelper.Context.getPackageName(),
    TAndroidHelper.StringToJString(AServiceName));

  AIntent.putExtra(StringToJString('q'), JParcelable(PendingIntent));

  TAndroidHelper.Activity.startService(AIntent);
end;

 

Получаю так:


TDM = class(TAndroidService)
    function AndroidServiceStartCommand(const Sender: TObject;
      const Intent: JIntent; Flags, StartId: Integer): Integer;
    procedure AndroidServiceCreate(Sender: TObject);
  private
    FPIntent: JPendingIntent;
    FStr: string;
    FThread: TssThread;
    procedure StartThread;
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
  end;

function TDM.AndroidServiceStartCommand(const Sender: TObject;
  const Intent: JIntent; Flags, StartId: Integer): Integer;
var
  ResultIntent: JIntent;
  Parcelable: JParcelable;
begin
  Parcelable := Intent.getParcelableExtra(StringToJString('q'));
  FPIntent := JPendingIntent(Parcelable);

  ResultIntent := TJIntent.Create;
  ResultIntent.putExtra(StringToJString('res'), StringToJString('content'));
  FPIntent.send(TAndroidHelper.Context, 7, ResultIntent);

  Result := TJService.JavaClass.START_STICKY;
end;

 

Есть еще идеи как вытащить отложенное намерение?

 

Опять же, повторюсь, нет возможности проверить, и особо времени нет вникнуть. Только, кажется, все немного усложнили вы себе с этой посылкой.

У PendingIntent есть метод readPendingIntentOrNullFromParcel(Parcel in)  который как раз вычитывает его из посылки.

Напрямую да, не получится привести их.

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

На самом деле нужно делать так:

TJParcelable.Wrap((PendingIntent  as ILocalObject).GetObjectID)

и

TJPendingIntent.Wrap((Parcelable  as ILocalObject).GetObjectID)

Но ожидаемого результата использования TAndroidHelper.Activity.createPendingResult не получилось. 

 

После TMessageManager.DefaultManager.SubscribeToMessage(TMessageResultNotification, HandleActivityMessage);

HandleActivityMessage  не получает результат из сервиса с помощью PendingIntent.send.

 

Будь неладен тот день для ider-ы, когда я решил написать приложение с сервисом на дельфи,

уже два месяца я не могу получить результат от сервиса:то

1. createPendingResult  приложение не получает результат.

2. для resultReceiver не хватает возможности получить результат в активити - переопределить onReceiveResult

 

Остаются способы PendingResult.getAction и PendingResylt.getBroadcast.

Первый способ (

) - уродский, уж извините, если закрыть приложение оно опять появится после ответа сервиса.

Второй, только его и остается проверить. Но идеологически он кажется неверным - использовать рассылку сообщений всей системе для своего, между мальчиками, общения тоже неверно.

Получается нельзя тут взрослое приложение-то сделать , только кошечек рисовать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
6 часов назад, serser сказал:

Получается нельзя тут взрослое приложение-то сделать , только кошечек рисовать.

в iOS вообще нет понятия сервисов и это не мешает разрабатывать взрослые приложения.

попробуйте изменить логику приложения. расскажите в двух словах, что вы хотите в принципе сделать, не технически, а какой функционал нужен?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.


  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

×
×
  • Создать...