0

我真的无法理解 Activity、Intent 和 start.. 即使在阅读了 Lars Vogels 教程(意图教程)之后

我试图使问题尽可能简洁。

2 个类(KKOTestActivity、VersionChangeInfo)和一个 AndroidManifest。

目标: KKOTestActivity 类启动,触发 VersionChangeInfo。该类显示一个带有三个按钮的对话框。其中之一是进入市场。这就是问题所在。当用户按下该按钮时,我收到 NPE 错误(请参阅下面的错误日志)。我真的不明白我在这里做什么,所以链接到 Intents-for-dummies 或其他东西也将不胜感激:)。谢谢!

KKOTest活动:

package happyworx.nl.KKOTest;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;


public class KKOTestActivity extends Activity implements OnClickListener {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        new VersionChangeInfo(this).show();
    }
    public void onClick(View v) {
        // TODO Auto-generated method stub  
    }
}

版本更改信息.java:

package happyworx.nl.KKOTest;

import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.preference.PreferenceManager;


public class VersionChangeInfo extends Activity {

    private String VCI_PREFIX = "vci_";
    private Activity mActivity;

    public VersionChangeInfo(final Activity context) {
        mActivity = context;
    }

    private PackageInfo getPackageInfo() {
        PackageInfo pi = null;
        try {
             pi = mActivity.getPackageManager().getPackageInfo(mActivity.getPackageName(), PackageManager.GET_ACTIVITIES);
        } catch (PackageManager.NameNotFoundException e) {
            e.printStackTrace();
        }
        return pi;
    }

     public void show() {
        PackageInfo versionInfo = getPackageInfo();

        // the eulaKey changes every time you increment the version number in the AndroidManifest.xml
        final String eulaKey = VCI_PREFIX + versionInfo.versionCode;
        final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(mActivity);
        boolean hasBeenShown = prefs.getBoolean(eulaKey, false);
        if(hasBeenShown == false){

            // Show the Eula
            String title = mActivity.getString(R.string.app_name) + " v" + versionInfo.versionName;

            //Includes the updates as well so users know what changed.
            String message = mActivity.getString(R.string.updates) + "\n\n" + mActivity.getString(R.string.eula);

            AlertDialog.Builder builder = new AlertDialog.Builder(mActivity)
                    .setTitle(title)
                    .setMessage(message)
                    .setPositiveButton("Ga naar Market", new Dialog.OnClickListener() {

                        public void onClick(DialogInterface dialogInterface, int i) {                           
                            // Mark this version as read.
                            SharedPreferences.Editor editor = prefs.edit();
                         //   editor.putBoolean(eulaKey, true);
                         //   editor.commit();
                            dialogInterface.dismiss();

                            final Intent MyIntent = new Intent(Intent.ACTION_VIEW, 
                            Uri.parse("market://details?id=happyworx.nl.Flashwords"));
                            startActivity(MyIntent);
                        }
                    })
                    .setNegativeButton("Later", new Dialog.OnClickListener() {

                        public void onClick(DialogInterface dialogInterface, int i) {
                            dialogInterface.dismiss();
                        }



                    })

                    .setNeutralButton("Niet meer tonen", new Dialog.OnClickListener(){
                        public void onClick(DialogInterface dialogInterface, int i) {
                            SharedPreferences.Editor editor = prefs.edit();
                            editor.putBoolean(eulaKey, true);
                            editor.commit();
                            dialogInterface.dismiss();
                        }
                    })
                    ;
            builder.create().show();
        }
    }

}

AndroidManifest.xls

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="happyworx.nl.KKOTest"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk android:minSdkVersion="4" />

    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" >
        <activity
            android:name=".KKOTestActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

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

                <activity
            android:name=".VersionChangeInfo"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

    </application>

</manifest>

错误日志:

04-19 08:06:45.711: E/AndroidRuntime(15186): FATAL EXCEPTION: main
04-19 08:06:45.711: E/AndroidRuntime(15186): java.lang.NullPointerException
04-19 08:06:45.711: E/AndroidRuntime(15186):    at android.app.Activity.startActivityForResult(Activity.java:2827)
04-19 08:06:45.711: E/AndroidRuntime(15186):    at android.app.Activity.startActivity(Activity.java:2933)
04-19 08:06:45.711: E/AndroidRuntime(15186):    at happyworx.nl.KKOTest.VersionChangeInfo$1.onClick(VersionChangeInfo.java:63)
04-19 08:06:45.711: E/AndroidRuntime(15186):    at com.android.internal.app.AlertController$ButtonHandler.handleMessage(AlertController.java:159)
04-19 08:06:45.711: E/AndroidRuntime(15186):    at android.os.Handler.dispatchMessage(Handler.java:99)
04-19 08:06:45.711: E/AndroidRuntime(15186):    at android.os.Looper.loop(Looper.java:123)
04-19 08:06:45.711: E/AndroidRuntime(15186):    at android.app.ActivityThread.main(ActivityThread.java:3683)
04-19 08:06:45.711: E/AndroidRuntime(15186):    at java.lang.reflect.Method.invokeNative(Native Method)
04-19 08:06:45.711: E/AndroidRuntime(15186):    at java.lang.reflect.Method.invoke(Method.java:507)
04-19 08:06:45.711: E/AndroidRuntime(15186):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
04-19 08:06:45.711: E/AndroidRuntime(15186):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
04-19 08:06:45.711: E/AndroidRuntime(15186):    at dalvik.system.NativeStart.main(Native Method)
4

3 回答 3

2

你没有做错;你得到的原因ActivityNotFoundException是因为你的设备上没有安装可以处理Intent.ACTION_VIEW. 原因是您选择查看market://-URI 而不是http(s)://. 您可能正在使用不包含 Market 的模拟器。

你有三个选择:

  1. 在您的模拟器上安装市场(不知道如何)。
  2. 保持原样;它可以在安装了 Market 的设备上运行。将您的呼叫包装startActivity()在一个try { .. } catch (ActivityNotFoundException e) { ... }.
  3. 将您的 URI 更改为http://https://

第三个选项将在模拟器中工作,即使没有安装市场。在您的设备上,它会提示您是要在 Market 中还是在浏览器中打开 URI。

我将尝试解释:

// First, you're basically telling Android you want some Activity
// that is not your current Activity to handle an action:
// you wan't `some application` to view `something`.
Intent i = new Intent(Intent.ACTION_VIEW);

// Next, you're making it clear you want an application to view a specific URI.
// In this case, you're asking for something that can handle a "market://"-URI.
i.setData(Uri.parse("market://details?id=happyworx.nl.Flashwords"));

// Finally, you're asking Android to actually broadcast the Intent.
startActivity(i);
于 2012-04-19T08:13:38.507 回答
1

<action android:name="android.intent.action.VIEW" />首先,您的 AndroidManifest.xml 中缺少<intent-filter>.

但是当这完成时,它无论如何都会崩溃,因为市场没有安装在模拟器上。不过,它应该可以在设备上正常工作。

于 2012-04-19T08:12:16.753 回答
0

尝试

Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("market://details?id=happyworx.nl.KKOTest"));
startActivity(intent);

并检查您的包裹名称。在您的课程中,您在 manifest happyworx.nl.KKOTest中使用happyworx.nl.Flashwords,如果您构建了指向应用程序的链接,则此包名称必须相同。您也可以使用 getPackageName() 方法而不是“your.package.name”

于 2012-04-19T08:21:01.983 回答