解决意图的活动问题 - resolveActivityInfo()

mis*_*kin 5 android resolve android-intent android-activity

我使用resolveActivityInfo来确定我的应用程序是否设置为主启动器:

    PackageManager pm = getPackageManager();

    Intent intent = new Intent(Intent.ACTION_MAIN, null);
    intent.addCategory(Intent.CATEGORY_HOME);   

    userHomePackage = intent.resolveActivityInfo(pm, 0).packageName;
    userHomeActivityClass = intent.resolveActivityInfo(pm, 0).name;     
currentHomeLauncherName = intent.resolveActivityInfo(pm, 0).loadLabel(pm).toString();
Run Code Online (Sandbox Code Playgroud)

它在模拟器和我手上的三个Android设备上运行良好.

最近我开始从我的用户那里收到错误报告,错误日志显示resolveActivityInfo失败.这种情况只发生在Android 2.1更新1上运行的几部手机上,我可以看到.我已收到很多关于我的应用程序的积极评论和一些负面因为这个问题.

有什么建议可能是错的吗?

java.lang.NullPointerException
    at android.os.Parcel.readException(Parcel.java:1224)
    at android.os.Parcel.readException(Parcel.java:1206)
    at android.content.pm.IPackageManager$Stub$Proxy.resolveIntent(IPackageManager.java:1418)
    at android.app.ApplicationContext$ApplicationPackageManager.resolveActivity(ApplicationContext.java:2046)
    at android.content.Intent.resolveActivityInfo(Intent.java:3790)
    at com.myapp.myappname.Launcher.setAsHomeApplicationBeforeFroyo(Launcher.java:336)
Run Code Online (Sandbox Code Playgroud)

要么

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.myapp.myappname/com.myapp.myappname.Launcher}: java.lang.NullPointerException
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2497)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2513)
    at android.app.ActivityThread.access$2200(ActivityThread.java:119)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1864)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:123)
    at android.app.ActivityThread.main(ActivityThread.java:4370)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:521)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:862)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:620)
    at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.NullPointerException
    at android.os.Parcel.readException(Parcel.java:1224)
    at android.os.Parcel.readException(Parcel.java:1206)
    at android.content.pm.IPackageManager$Stub$Proxy.resolveIntent(IPackageManager.java:1418)
    at android.app.ApplicationContext$ApplicationPackageManager.resolveActivity(ApplicationContext.java:2046)
    at android.content.Intent.resolveActivityInfo(Intent.java:3790)
    at com.myapp.myappname.Launcher.showHomeChooserDialog(Launcher.java:141)
    at com.myapp.myappname.Launcher.showNextActivity(Launcher.java:122)
    at com.myapp.myappname.Launcher.onCreate(Launcher.java:59)
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2460)
    ... 11 more
java.lang.NullPointerException
    at android.os.Parcel.readException(Parcel.java:1224)
    at android.os.Parcel.readException(Parcel.java:1206)
    at android.content.pm.IPackageManager$Stub$Proxy.resolveIntent(IPackageManager.java:1418)
    at android.app.ApplicationContext$ApplicationPackageManager.resolveActivity(ApplicationContext.java:2046)
    at android.content.Intent.resolveActivityInfo(Intent.java:3790)
    at com.myapp.myappname.Launcher.showHomeChooserDialog(Launcher.java:141)
Run Code Online (Sandbox Code Playgroud)

mis*_*kin 1

对 android 源码做了一些研究,我现在倾向于同意 Commonsware 的观点,即我的代码是正确的。实际上,我在三周前重新设计了它,使用 packagemanager.resolveActivity 而不是intent.resolveactivity:

\n\n
this.pm = context.getPackageManager();\n\n    try {\n        Intent homeintent = new Intent(Intent.ACTION_MAIN);\n        homeintent.addCategory(Intent.CATEGORY_HOME);\n        homeintent.addCategory(Intent.CATEGORY_DEFAULT);// seems not needed here since This is a synonym for\n                                // including\n        // the CATEGORY_DEFAULT in your supplied Intent per doc\n\n        this.resolveInfo = pm.resolveActivity(homeintent, PackageManager.MATCH_DEFAULT_ONLY);\n\n        ActivityInfo activityInfo = resolveInfo.activityInfo;\n\n        userHomeLauncherPackage = activityInfo.packageName;\n        userHomeLauncherClass = activityInfo.name;\n\n        userHomeLauncherName = activityInfo.loadLabel(pm).toString();\n\n        if (userHomeLauncherClass.contains("ResolverActivity"))\n        userHomeLauncherName = "";\n\n    } catch (Exception e) {\n        throw new Exception(e);\n    }\n
Run Code Online (Sandbox Code Playgroud)\n\n

这没有帮助,所以仍然偶尔会出现这些错误......

\n\n

基于源代码,

\n\n

ComponentName Intent.resolveActivity (PackageManager pm)

\n\n

或者

\n\n

ActivityInfo Intent.resolveActivityInfo (PackageManager pm, int flags)

\n\n

调用 android.app.ContextImpl 类中定义的相同方法:

\n\n

ResolveInfo\xc2\xa0info\xc2\xa0=\xc2\xa0pm.resolveActivity(this,\xc2\xa0PackageManager.MATCH_DEFAULT_ONLY)

\n\n

它的定义如下:

\n\n
        @Override\n    public ResolveInfo resolveActivity(Intent intent, int flags) {\n        try {\n            return mPM.resolveIntent(\n                intent,\n                intent.resolveTypeIfNeeded(mContext.getContentResolver()),\n                flags);\n        } catch (RemoteException e) {\n            throw new RuntimeException("Package manager has died", e);\n        }\n    }\n
Run Code Online (Sandbox Code Playgroud)\n\n

所以此时我得出的结论是我对此无能为力:(

\n