0

Я делаю приложение Android с двумя действиями и классом Java, который считывает/записывает данные RFID с использованием NFC.startActivity (намерение) не открывает активность

Я использую метод enableReaderMode(), чтобы включить режим чтения/записи в mainActivity, который затем вызывает onTagDiscovered в отдельном классе java. Однажды в методе onTagDiscovered я вызываю mainActivity.startNewActivity(), чтобы открыть второе действие. Я знаю, что я достигаю startNewActivity() из-за сообщения журнала, но активность на самом деле не начинается. Приложение не сбой, и я не получаю никаких ошибок, он просто не запускается. Я попытался поместить кнопку в mainActivity и открыть этот путь, и он отлично работает. Он просто не работает, когда я вызываю метод из encode.java.

** Я знаю, что нет необходимости открывать активность из Encode.java и что я мог бы напрямую кодировать это в MainActivity, но я готов сделать что-то более сложное, где мне нужно будет открыть из Encode .java, и я хочу проверить, что активность будет открыта вообще.

Вот код

Encode.java

public class Encode implements NfcAdapter.ReaderCallback { 
    MainActivity mainActivity = new MainActivity(); 

    public void onTagDiscovered(Tag tag) { 
     Log.i(TAG, "New tag discovered"); 
     mainActivity.startNewActivity(); 
    } 

MainActivity

public void startNewActivity() { 
    Log.v(TAG, "in startNewActivity"); 
    Intent intent = new Intent(this, Success.class); 
    startActivity(intent); 
} 

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.project" > 

    <uses-sdk android:minSdkVersion="10" /> 
    <uses-permission android:name="android.permission.NFC"/> 
    <uses-permission android:name="android.permission.INTERNET" /> 
    <uses-feature android:name="android.hardware.nfc" android:required="true" /> 

    <application 
     android:allowBackup="true" 
     android:icon="@drawable/xband" 
     android:label="@string/app_name" 
     android:theme="@style/AppTheme" > 

     <activity 
      android:name=".MainActivity" 
      android:label="@string/app_name" > 

      <intent-filter> 
       <action android:name="android.nfc.action.NDEF_DISCOVERED" /> 
       <action android:name="android.nfc.action.TECH_DISCOVERED" /> 
       <action android:name="android.nfc.action.TAG_DISCOVERED" /> 
       <category android:name="android.intent.category.DEFAULT" /> 
      </intent-filter> 

      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 

      <meta-data android:name="android.nfc.action.TECH_DISCOVERED" 
       android:resource="@xml/nfc_tech" /> 

     </activity> 
     <activity android:name=".Success" > 

     </activity> 
    </application> 

</manifest> 

Success.java

package com.project; 

import android.app.Activity; 
import android.os.Bundle; 
import android.util.Log; 

public class Success extends Activity { 
    private static final String TAG = "encode"; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     setContentView(R.layout.success_activity); 
     Log.v(TAG, "in success activity"); 
    } 


} 

Я попытался добавить следующий код, а затем получил сообщение об ошибке: Encode.java

public void onTagDiscovered(Tag tag) { 
     Log.i(TAG, "New Tag Discovered"); 
     Handler handler = new Handler(Looper.getMainLooper()); 
     handler.post(new Runnable() { 
      @Override 
      public void run() { 
       mainActivity.startNewActivity(); 
      } 
     }); 
} 


02-20 11:52:27.739 22088-22088/com.project E/AndroidRuntime﹕ FATAL EXCEPTION: main 
    Process: com.project, PID: 22088 
    java.lang.NullPointerException 
      at android.app.Activity.startActivityForResult(Activity.java:3474) 
      at android.app.Activity.startActivityForResult(Activity.java:3435) 
      at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:817) 
      at android.app.Activity.startActivity(Activity.java:3677) 
      at android.app.Activity.startActivity(Activity.java:3645) 
      at com.project.MainActivity.startNewActivity(MainActivity.java:110) 
      at com.project.encoding.Encode$1.run(Encode.java:331) 
      at android.os.Handler.handleCallback(Handler.java:733) 
      at android.os.Handler.dispatchMessage(Handler.java:95) 
      at android.os.Looper.loop(Looper.java:157) 
      at android.app.ActivityThread.main(ActivityThread.java:5293) 
      at java.lang.reflect.Method.invokeNative(Native Method) 
      at java.lang.reflect.Method.invoke(Method.java:515) 
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1265) 
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1081) 
+4

есть ли причина, почему один называется 'mainActivity.startNewActivity();' а другой называется 'startNewActivity2()'? – EpicPandaForce

+0

предназначено, чтобы взять 2 выхода. Это не в реальном коде. Благодаря! – mofitty

+0

в худшем случае, попробуйте следующий код: «Обработчик обработчика = новый обработчик (Looper.getMainLooper()); handler.post (new Runnable() {public void run() {mainActivity.startNewActivity();}); ' – EpicPandaForce

ответ

1

Кто-то на работе был в состоянии помочь мне понять это. Это не работает, потому что я создавал новый экземпляр MainActivity в Encode, вместо ссылки на существующий MainActivity.

В MainActivity мы добавлено:

private static MainActivity _instance = null; 

    @Override 
     protected void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.activity_main); 
      encode = new Encode(); 

      enableReaderMode(); 

      MainActivity._instance = this; 
     } 

     public static MainActivity getInstance() { 
      return _instance; 
     } 

и Encode мы назвали метод startNewActivity по телефону:

public void onTagDiscovered(Tag tag) { 
    Log.i(TAG, "New Tag Discovered"); 

    MainActivity.getInstance().startNewActivity(); 

}); 

так что теперь Encode использует существующий экземпляр MainActivity

0

Вместо: Intent intent = new Intent(this, Success.class);
Try: Intent intent = new Intent(getApplicationContext(), Success.class);

Это работало для меня однажды, потому что оно «Возвращает контекст одного глобального объекта приложения текущего процесса. "