2016-04-01 3 views
2

onResume,などの主要なアクティビティライフサイクルメソッドをオーバーライドするAndroidサンプルが、コードネーム1で見つかりました。私はインターフェイスクラスを介してAndroidのネイティブコードにアクセスしています。コードネームワンオーバーライドonNewIntentアクティビティメソッド

ここでは、onNewIntentというメソッドをオーバーライドしたいと思います。どうすればそれを達成できますか?それも可能ですか? public void start()public void stop()のようなC1メソッドを渡す必要がありますか?

私は携帯電話でNFCを有効にしました.NFCカードが電話にかけられたら、そのNFCの意図を把握したいと思います。このインテントはonNewIntentを通じてアプリに送信されます。

答えて

0

私が正しい質問を理解していれば、異なる活動の新しい固有の方法を扱う共通の場所が必要です。

もしそうなら、カスタムアクティビティを定義し、それ以外のアクティビティを拡張します。

​​
+0

あなたは私が意味するものに非常に近いです。私の問題は、私はアンドロイドのネイティブ部分にアクセスすると、私はメインの活動を通じてコードネームワンのアクセスと思うが、私はそれを変更して上書きするアクセス権がない。私はAndroidUtilNative.addLifecycleListenerクラスを見つけました。おそらくそれが私が探しているものです。 – Giuliano

1

あなたはコードネームつのフレームワーク(または特にそのAndroidの実装)を変更しない限り、あなたはonNewIntent()コールバックを受け取るために行うことができます多くはありません。 LifecycleListenerの現在の実装は、onNewIntent()ライフサイクルメソッドをサポートしていません。また、唯一のものはonNewIntent()コールバック火災が現在の活動の意図として、新たな意図を格納するときにコードネームの一つがないこと(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()が呼び出される唯一の理由ではないので(実際にはこれが起こる他の多くの理由があります)、その特定のインテントを一度だけ処理するというチェックを実装したいかもしれません。

+0

'onResume()'メソッドは正常に動作します。今問題は 'onCreate()'です。私は、私は再開の警告を取得し、その後、警告を作成するアプリケーションを再開した後、私は何も起こらない、アプリケーションを起動すると、両方の内部に警告を入れます。どうして?なぜ私が最初にCreateアラートをキャッチしないのか理解できません。 – Giuliano

+0

@Giulianoコードネーム1つのAndroidの実装を見る私はなぜこれが起こるのか分かりません。 'start()'が呼び出されたCN1以降にLifecycleListenerを登録することができますか? –

+0

アラートに関するスレッドの問題かもしれませんが、リスナー内でどのようにデバッグするのか分からないので、私はそれらを使用しました。とにかく私の主な問題は、私はアプリを起動したときに私は何もアラートを取得しないことですが、私はアプリを一時停止し、それを再開した後、私はアラートを取得し、私が望むようにアプリが動作します。ですから、リスナーは最初の 'onCreate'と' onResume'を得ることができないようで、 'enableForegroundDispatch()'を実行するには 'onResume'をキャッチする必要があります。私はC1の 'init()'でリスナーをinitiliazeしようとしましたが、常に同じです。活動がすでに作成されているためでしょうか? – Giuliano

2

コードネーム1とは全く関係のない完全に別個のアクティビティを作成し、それをネイティブ/アンドロイド階層に配置することができます。マニフェストXMLに登録するには、android.xactivitybuild hintのようなものを使用します。

ここから、コードネーム1に戻って通信できるネイティブアクティビティになります。

コードネームワンコードがonResumeに応答するようにするには、アプリケーションを再起動するときに呼び出されるstart()メソッドで書き込むことができます。

+0

は完璧です。ネイティブ/アンドロイド/ com/mycompany/myappパスに新しいクラスを作成すると、ファイルが消えてtheme.resとともにソースパッケージ内に入りますが、私はそれが大丈夫だとは思わない。それで、私は何をする必要がありますか?その後、私はそれを私の主な活動にしたいと思います。私はそれをC1からのインターフェイスクラスから始めるべきですか? – Giuliano

+0

IDEで消えますか?私はあなたがコンパイルされたアプリを意味すると思いますか?それはソースの一部であることが意図されているので、AndroidのビルドのためだけにAndroidのビルドのために完全にうまくいく。 iOSターゲットビルドを送信する場合、ファイルは完全に無視されます。 –

1

わかりました。私はLifecycleListener()ソリューションを使用しました。これは私のやり方です:私のインターフェイスクラスで私はLifecycleListenerを作成するための静的メソッドを作成し、AndroidNativeUtil.addLifecycleListener(myListener);を実行します。私はこの静的メソッドを、android.onCreate=com.mycompany.myapp.MyNativeImpl.start();というアプリのビルドヒントから呼んでいます。私のアプリを起動すると、onResume()の方法で通知された警告がポップアップします。完璧。

C1のinit/start/stopを使用する別のアプローチがありますが、それを動作させることができませんでした。私はnfcAdapter.enableForegroundDispactch(...)にnullポインタを持っていますが、私はアダプタとすべてのパラメータがメソッドを使用する前にnullでないかどうかをチェックするので、なぜわかりません。 多分それは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); 
関連する問題