Sprint三星Galaxy s2 - 活动泄露了IntentReceiver - 你是否错过了对unregisterReceiver()的调用

时间:2011-09-23 08:18:55

标签: android

我没有在Droid Bionic,Droid 3,Motorola Photon 4g,HTC Evo 3d和Thunderbolt上看到这个错误。

此示例应用程序将通过以下步骤抛出“泄露的IntentReceiver”错误:

  • 以某种方式获得Sprint三星Galaxy s2 Epic Touch 4g(4.52英寸屏幕)
  • 启动申请
  • 按“启动活动二”按钮
  • 打开菜单,然后打开子菜单(食物) - 注意:您无需单击选项,只需查看子菜单就足够了
  • 按手机的后退按钮关闭子菜单和菜单。
  • 再次按手机的后退按钮返回ActivityOne - eclipse将打印以下错误。

如果您只是打开菜单并选择一个选项(不是子菜单),那么按后退按钮就不会看到错误。

所以我的问题是:这个注册的IntentReceiver来自哪里,我该如何取消注册呢?

感谢您的时间。

# AndroidManifest.xml (Target version is 2.3.3)

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.test" android:versionCode="1" android:versionName="1.0">
    <uses-sdk android:minSdkVersion="10" />
    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <activity android:name=".ActivityOne" 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=".ActivityTwo"></activity>
    </application>
</manifest>


# one.xml (layout for ActivityOne)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="fill_parent"
    android:layout_height="fill_parent">
    <TextView android:layout_width="fill_parent"
        android:layout_height="wrap_content" android:text="Hello this is activity one" />
    <Button android:layout_width="wrap_content"
        android:layout_height="wrap_content" android:id="@+id/launch_activity_two"
        android:text="Launch Activity Two" />
</LinearLayout>


# two.xml (layout for ActivityTwo)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="fill_parent"
    android:layout_height="fill_parent">
    <TextView android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="Hello this is activity Two.  The only way to leave is by pressing the back button on your phone.  If you open a submenu (press menu button then select a submenu) - then press the back button on your phone there will be an exception thrown." />
</LinearLayout>


# menu/menu.xml

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@+id/food" android:title="Food">
        <menu>
            <item android:id="@+id/food_is_good" android:title="Food is good" />
            <item android:id="@+id/food_is_delicious" android:title="Food is delicious" />
            <item android:id="@+id/food_is_bad" android:title="Food is bad" />
        </menu>
    </item>
    <item android:id="@+id/doggies_are_cuddly" android:title="Doggies are cuddly" />
</menu>


# ActivityOne

public class ActivityOne extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.one);

        // launches activity two
        Button button = (Button)findViewById(R.id.launch_activity_two);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(getApplicationContext(), ActivityTwo.class);
                startActivity(intent);              
            }
        });

        Log.v("Samsung Galaxy sII", "Created Activity One");
    }
}


# ActivityTwo

public class ActivityTwo extends Activity {

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.two);
        Log.v("Samsung Galaxy sII", "Created Activity Two");
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        Log.v("Samsung Galaxy sII", "Creating options menu");
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.menu, menu);
        return super.onCreateOptionsMenu(menu);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle item selection
        switch (item.getItemId()) {
        case R.id.food_is_bad:
            Log.v("Samsung Galaxy sII", "Food is bad");
            return true;
        case R.id.food_is_good:
            Log.v("Samsung Galaxy sII", "Food is good");
            return true;
        case R.id.food_is_delicious:
            Log.v("Samsung Galaxy sII", "Food is delicious");
            return true;
        case R.id.doggies_are_cuddly:
            Log.v("Samsung Galaxy sII", "Doggies are cuddly");
            return true;
        default:
            return super.onOptionsItemSelected(item);
        }
    }
}



09-23 00:46:09.210: VERBOSE/Samsung Galaxy sII(28668): Created Activity Two
09-23 00:46:11.791: VERBOSE/Samsung Galaxy sII(28668): Created Activity Two
09-23 00:46:12.705: VERBOSE/Samsung Galaxy sII(28668): Creating options menu
09-23 00:46:19.120: ERROR/ActivityThread(28668): Activity com.test.ActivityTwo has leaked IntentReceiver com.android.internal.view.menu.MenuDialogHelper$1@4052c470 that was originally registered here. Are you missing a call to unregisterReceiver()?
09-23 00:46:19.120: ERROR/ActivityThread(28668): android.app.IntentReceiverLeaked: Activity com.test.ActivityTwo has leaked IntentReceiver com.android.internal.view.menu.MenuDialogHelper$1@4052c470 that was originally registered here. Are you missing a call to unregisterReceiver()?
09-23 00:46:19.120: ERROR/ActivityThread(28668):     at android.app.LoadedApk$ReceiverDispatcher.<init>(LoadedApk.java:756)
09-23 00:46:19.120: ERROR/ActivityThread(28668):     at android.app.LoadedApk.getReceiverDispatcher(LoadedApk.java:551)
09-23 00:46:19.120: ERROR/ActivityThread(28668):     at android.app.ContextImpl.registerReceiverInternal(ContextImpl.java:858)
09-23 00:46:19.120: ERROR/ActivityThread(28668):     at android.app.ContextImpl.registerReceiver(ContextImpl.java:845)
09-23 00:46:19.120: ERROR/ActivityThread(28668):     at android.app.ContextImpl.registerReceiver(ContextImpl.java:839)
09-23 00:46:19.120: ERROR/ActivityThread(28668):     at android.content.ContextWrapper.registerReceiver(ContextWrapper.java:318)
09-23 00:46:19.120: ERROR/ActivityThread(28668):     at com.android.internal.view.menu.MenuDialogHelper.show(MenuDialogHelper.java:97)
09-23 00:46:19.120: ERROR/ActivityThread(28668):     at com.android.internal.policy.impl.PhoneWindow.onSubMenuSelected(PhoneWindow.java:808)
09-23 00:46:19.120: ERROR/ActivityThread(28668):     at com.android.internal.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:867)
09-23 00:46:19.120: ERROR/ActivityThread(28668):     at com.android.internal.view.menu.IconMenuView.invokeItem(IconMenuView.java:532)
09-23 00:46:19.120: ERROR/ActivityThread(28668):     at com.android.internal.view.menu.IconMenuItemView.performClick(IconMenuItemView.java:122)
09-23 00:46:19.120: ERROR/ActivityThread(28668):     at android.view.View$PerformClick.run(View.java:9238)
09-23 00:46:19.120: ERROR/ActivityThread(28668):     at android.os.Handler.handleCallback(Handler.java:587)
09-23 00:46:19.120: ERROR/ActivityThread(28668):     at android.os.Handler.dispatchMessage(Handler.java:92)
09-23 00:46:19.120: ERROR/ActivityThread(28668):     at android.os.Looper.loop(Looper.java:130)
09-23 00:46:19.120: ERROR/ActivityThread(28668):     at android.app.ActivityThread.main(ActivityThread.java:3691)
09-23 00:46:19.120: ERROR/ActivityThread(28668):     at java.lang.reflect.Method.invokeNative(Native Method)
09-23 00:46:19.120: ERROR/ActivityThread(28668):     at java.lang.reflect.Method.invoke(Method.java:507)
09-23 00:46:19.120: ERROR/ActivityThread(28668):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:907)
09-23 00:46:19.120: ERROR/ActivityThread(28668):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:665)
09-23 00:46:19.120: ERROR/ActivityThread(28668):     at dalvik.system.NativeStart.main(Native Method)

2 个答案:

答案 0 :(得分:0)

每次显示选项菜单时都会调用

onCreateOptionsMenu(Menu menu)。我确实也有一些奇怪的效果,现在使用onPrepareOptionsMenu(Menu menu)代替这个只为活动调用一次,这可能有助于解决这个问题。

也许在S2上安装的Android版本再次为子菜单调用该方法,并以某种方式泄漏已注册的IntentReceiver,因为在这种情况下菜单将被创建两次。

答案 1 :(得分:0)

检查菜单是否有错误。有几种方法可以在SG2上获得此错误。即使在多个设备上忽略了错误,错误也是正确的。总的来说,在菜单操作中做一些导致菜单正常处理结束的事情会给你这个错误。从具有子菜单的项目上的onOptionsItemSelected启动活动。