2016-04-01 4 views
2

Я нашел много примеров для Android, которые переопределяют основные жизненные методы активности, такие как onResume, и т. Д. С Codename One. Я получаю доступ к собственному коду Android через класс интерфейса.Codename One override Android onNewIntent метод активности

Теперь я также хотел бы переопределить метод onNewIntent. Как я могу это сделать? Возможно ли это? Нужно ли мне проходить через методы C1, такие как public void start() и public void stop()?

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

ответ

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 { 

} 
+0

Вы очень близки к тому, что я имею в виду. Моя проблема в том, что когда я получаю доступ к родной части Android, я думаю, что Codename One доступ через основное действие, но у меня нет доступа к его модификации и переопределению. Я нашел класс AndroidUtilNative.addLifecycleListener, возможно, это то, что я ищу. – Giuliano

1

Если вы не измените один каркас Codename (или в частности его Android реализации), существует не так много вы можете сделать, чтобы получить onNewIntent() обратного вызова. Текущая реализация LifecycleListener не поддерживает метод жизненного цикла onNewIntent(). Кроме того, единственное, что Codename один делает, когда 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. Так как invokeation onNewIntent() не является единственной причиной, почему onResume() может быть вызван (на самом деле есть много других причин, которые могут произойти), возможно, вам захочется реализовать некоторую проверку того, что вы обрабатываете это конкретное намерение только один раз.

+0

Хорошо, метод 'onResume()' отлично работает. Теперь проблема заключается в 'onCreate()'. Я поставил предупреждение внутри обоих из них, когда я запускаю приложение, ничего не происходит, после того, как я возобновляю приложение, я получаю предупреждение «Возобновить», а затем создаю предупреждение. Зачем? Я также не понимаю, почему я не поймаю предупреждение Create в первую очередь ... – Giuliano

+0

@Giuliano Глядя на Codename Одна реализация Android Я не знаю, почему это произойдет. Может быть, вы зарегистрируете LifecycleListener в или после вызова CN1 'start()'? –

+0

Возможно, это проблема с потоками в отношении предупреждений, я использовал их, потому что я не знаю, как отлаживать внутри слушателя. В любом случае моя основная проблема заключается в том, что при первом запуске приложения я не получаю никакого предупреждения, но после того, как я приостанавливаю приложение, а затем возобновляю его, я получаю предупреждение, и приложение работает так, как я хочу. Таким образом, кажется, что слушатель не может получить первые 'onCreate' и' onResume', и мне нужно поймать 'onResume', чтобы сделать' enableForegroundDispatch() '. Я также попытался инициализировать слушателя в 'init()' из C1, но он всегда один и тот же. Наверное, потому что активность уже создана? – Giuliano

2

Вы можете создать совершенно отдельный вид деятельности, который полностью не связан с Codename One и поместить его в исходную/андроидную иерархию. Вы можете зарегистрировать его в манифесте XML, используя что-то вроде android.xactivitybuild hint.

С этого момента он просто становится родным, который может связываться с Codename One.

Обратите внимание, что если вы хотите, чтобы код Codename One отвечал на onResume, вы можете просто написать его в методе start(), который вызывается, когда приложение перезапускается.

+0

это будет идеально. Если я создаю новый класс в пути native/android/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(). Отлично.

Существует еще один подход, используя init/start/stop C1, но я не смог заставить его работать. Я получил нулевой указатель на 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);