startActivity(intent)不是打开活动

时间:2015-02-19 20:43:33

标签: java android android-intent android-activity start-activity

我正在制作一个包含2个活动的Android应用程序和一个使用NFC读取/写入RFID数据的Java类。

我正在使用enableReaderMode()方法在mainActivity中启用读取器/写入器模式,然后在单独的java类中调用onTagDiscovered。进入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)

2 个答案:

答案 0 :(得分: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实例

答案 1 :(得分:0)

而不是: Intent intent = new Intent(this, Success.class);
尝试:Intent intent = new Intent(getApplicationContext(), Success.class);

这对我有用一次导致它“返回当前进程的单个全局Application对象的上下文。”