Codename One覆盖Android onNewIntent活动方法

时间:2016-04-01 09:19:00

标签: java android android-intent nfc codenameone

我发现很多Android示例都会使用Codename One覆盖主要的Activity生命周期方法,例如onResumeonPause等。我通过接口类访问Android本机代码。

现在我想覆盖方法onNewIntent。我怎么能做到这一点?它甚至可能吗?我是否需要通过public void start()public void stop()

等C1方法

我已经在手机上激活了NFC,当我的NFC卡固定在手机上时,我想抓住NFC意图。此意图通过onNewIntent发送给应用。

4 个答案:

答案 0 :(得分:2)

您可以创建一个与Codename One完全无关的完全独立的活动,并将其放在native / android层次结构中。您可以使用android.xactivity build hint

之类的内容在清单XML中注册它

从这一点开始,它就变成了一个本地活动,可以与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()后获取该意图。

  1. 您首先要创建一个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);
    
  2. 然后,您将在onResume侦听器中检索意图:

    public void onResume() {
        Activity myActivity = AndroidNativeUtil.getActivity();
        Intent potentialNfcIntent = myActivity.getIntent();
    
        // do something with the intent if its an NFC intent
    }
    
  3. 由于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 {

}