我正在开发一个Android项目,该项目应该通过共享活动从另一个应用程序中获取字符串。
如果应用程序未处于活动状态,我可以从OnCreate或单击按钮获取getIntent信息。但是当应用程序已经启动并且在后台运行时,如果另一个应用程序发送了另一个意图,我会获得与OnCreate相同的意图,而不是新的意图。
由于
Var
Intent: JIntent;
S: String;
begin
Try
Intent := SharedActivity.getIntent;
if Intent Nil Then
Begin
if TJIntent.JavaClass.ACTION_SEND.equals(intent.getAction) Then
Begin
S := JStringToString(intent.getStringExtra(TJIntent.JavaClass.EXTRA_TEXT));
End;
End;
Except
On E: Exception Do
ShowMessage(E.Message);
End;
雷米,
感谢您的回复。
我尝试了一切(我认为)并且无法使其发挥作用。这就是我所做的:
我按照Brian的说明,在没有NFC调用的情况下构建了一个新的.Jar文件,并且在启动时失败了,这是来自DDMS的日志:
05-13 11:46:49.101:E / AndroidRuntime(16597): java.lang.RuntimeException:无法实例化活动 ComponentInfo {com.blong.IntentTest / com.blong.nfc.NativeActivitySubclass}: java.lang.ClassNotFoundException:没找到类 路径上的“com.blong.nfc.NativeActivitySubclass”:DexPathList [[zip文件] “/data/app/com.blong.IntentTest-1/base.apk"],nativeLibraryDirectories=[/data/app/com.blong.IntentTest-1/lib/arm, / vendor / lib,/ system / lib]]
所以我从包含NFC的原始.Java文件中重新绑定了.Jar文件,但它也没有用。当应用程序处于后台并从新意图启动时,应用程序显示黑屏并在其出现时立即冻结,最后一件事是在onNewIntent过程中对所有内容进行注释,结果是相同的 - 黑屏。 / p>
然后我意识到应用程序在另一个应用程序发送意图时启动了两次,并且两个实例都冻结了,请参阅图片。
我还尝试按照ci_ post中的建议将singletop添加到launchmode中 - 没有成功。
我怎样才能让这么简单的事情发挥作用?
由于
答案 0 :(得分:1)
Activity.getIntent()
返回启动调用进程的Intent
。如果进程在已经运行时收到新的Intent
,则不会更新。 Android有一个onNewIntent
事件用于此目的,但不幸的是FireMonkey不公开该事件。但是,有一种解决方法,如以下博客中所述:
Using NFC in Delphi XE7 Android apps | Receiving new intents at runtime
回应新意图所需的步骤如下:
- 继承Java代码中的标准FireMonkey Java本机活动类(.java文件),实现一个调用本机方法的onNewIntent()方法,我们将在Delphi中实现/ LI>
- 使用javac.exe将Java代码编译为已编译的Java类文件(.class文件),引用Embarcadero编译的Java活动类
- 使用jar.exe
将Java类文件添加到Java存档(.jar文件)
- 将.jar文件添加到Delphi项目中
Delphi代码中的- 声明了一个将由Java代码
调用的本机JNI方法- 编排从Java UI线程到FireMonkey线程的线程切换,沿途将任何JNI参数对象变形为Java Bridge包装器对象
博客详细介绍了每个步骤,显示了Java和Delphi代码必须实现它。