我真的无法理解 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)