我发现很多Android示例都会使用Codename One覆盖主要的Activity生命周期方法,例如onResume
,onPause
等。我通过接口类访问Android本机代码。
现在我想覆盖方法onNewIntent
。我怎么能做到这一点?它甚至可能吗?我是否需要通过public void start()
和public void stop()
?
我已经在手机上激活了NFC,当我的NFC卡固定在手机上时,我想抓住NFC意图。此意图通过onNewIntent
发送给应用。
答案 0 :(得分:2)
您可以创建一个与Codename One完全无关的完全独立的活动,并将其放在native / android层次结构中。您可以使用android.xactivity
build hint。
从这一点开始,它就变成了一个本地活动,可以与Codename One进行通信。
请注意,如果您希望Codename One代码响应onResume,您只需在重新启动应用程序时调用的start()
方法中编写它。
答案 1 :(得分:1)
除非您修改Codename One框架(或特别是其Android实现),否则您无法接收onNewIntent()
回调。 LifecycleListener
的当前实现不支持onNewIntent()
生命周期方法。当onNewIntent()
回调触发时,Codename One唯一做的就是将新意图存储为当前活动意图(参见CodenameOneActivity.java:367):
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
setIntent(intent);
}
因此,如果您需要在onNewIntent()
触发时收到通知,唯一的方法是修改Codename One框架。
但是,您可以执行以下操作:使用onResume()
生命周期方法。保证在onNewIntent()
之后调用此方法,并且由于使用setIntent(...)
更新了当前活动意图,因此您可以在应用通知onResume()
后获取该意图。
您首先要创建一个lifecylce侦听器对象,并使用AndroidNativeUtil
类注册它:
LifecycleListener listener = new LifecycleListener() {
public void onCreate(Bundle savedInstanceState) {}
public void onPause() {}
public void onDestroy() {}
public void onSaveInstanceState(Bundle b) {}
public void onLowMemory() {}
public void onResume() {
// this is where you get notified about onResume()
}
};
AndroidNativeUtil.addLifecycleListener(listener);
然后,您将在onResume
侦听器中检索意图:
public void onResume() {
Activity myActivity = AndroidNativeUtil.getActivity();
Intent potentialNfcIntent = myActivity.getIntent();
// do something with the intent if its an NFC intent
}
由于onNewIntent()
的调用不是调用onResume()
的唯一原因(实际上还有许多其他原因可能发生),您可能希望实现一些检查你只处理一次特定的意图。
答案 2 :(得分:1)
好的,我让它运转了。我使用了LifecycleListener()
解决方案。我就这样做了:在我的接口类中,我创建了一个静态方法来创建我的LifecycleListener并执行AndroidNativeUtil.addLifecycleListener(myListener);
。我使用android.onCreate=com.mycompany.myapp.MyNativeImpl.start();
从应用程序的内置提示中调用此静态方法。当我启动我的应用程序时,弹出onResume()
方法中的警报。完善。
还有另一种方法,使用C1的init / start / stop,但我无法使其工作。我在nfcAdapter.enableForegroundDispactch(...)上得到了空指针,我不知道为什么,因为我在使用该方法之前检查适配器和每个参数是否为空。
也许是PendingIntent
问题?这就是我写它的方式:
final Intent intent = new Intent(AndroidNativeUtil.getActivity().getApplicationContext(), AndroidNativeUtil.getActivity().getClass());
intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
pendingIntent = PendingIntent.getActivity(AndroidNativeUtil.getActivity().getApplicationContext(), 0, intent, 0);
答案 3 :(得分:0)
如果我理解正确的问题,你想要一个共同的地方来处理不同活动的newIntent方法。
如果是,则定义自定义活动并使其他活动扩展它。
public class CustomActivity extends AppCompatActivity {
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
// put your code here
}
}
public class SomeActivity extends CustomActivity {
}