【问题标题】:Calling startActivity(intentServiceIntent) within (Sherlock)DialogFragment results in ActivityNotFoundException在 (Sherlock)DialogFragment 中调用 startActivity(intentServiceIntent) 导致 ActivityNotFoundException
【发布时间】:2012-05-31 14:21:55
【问题描述】:

场景:

SherlockFragmentActivity 显示 SherlockFragment。 显示 SherlockDialogFragment 的 SherlockFragment。

版本:

  • 构建 API:Google API 15
  • 兼容性/支持包:v4
  • ActionBarSherclock:4.1.0
  • Android 模拟器:API-8

代码:

SherlockFragmentActivity:

public class TrailerDetailSherlockFragmentActivity extends SherlockFragmentActivity {
    ...
    /*
     * set up the fragment which will display the sensor details,
     * and allow changes of the alarm settings
     */                     
    detailFragment = new TempsensorDetailSherlockFragment();

    transaction = getSupportFragmentManager().beginTransaction();
    transaction.replace(R.id.framelayout_td_sensordetail, detailFragment);
    transaction.commit();   
    ...
    }

SherlockFragment:

public class TempsensorDetailSherlockFragment extends SherlockFragment {
    ...
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        ...
        // set the onClick method for the alarm values
        View alarmValueLayout = tempsensorDetailView.findViewById(R.id.ll_sd_minmax);
        alarmValueLayout.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {

                FragmentManager fm = activity.getSupportFragmentManager();

                // Create and show the dialog.
                SetAlarmTemperatureSherlockDialogFragment setAlarmTempsDialogFragment = new SetAlarmTemperatureSherlockDialogFragment(deviceString, alarm);
                setAlarmTempsDialogFragment.show(fm, "dialog");
            }
        });
        ...
    }

SherlockDialogFragment:

public class SetAlarmTemperatureSherlockDialogFragment extends SherlockDialogFragment {
    ...
    @Override
    public void onAttach(Activity activity) {
        ...
        this.activity = (SherlockFragmentActivity) activity;
        notificationServiceUtil = new NotificationServiceUtil(activity);
        ...
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,  Bundle savedInstanceState) {
    ...
    saveButton = (ImageButton) view.findViewById(R.id.btn_setalarmtemp_save);
            saveButton.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View v) {

                    ...
                    notificationServiceUtil.alarmSubscribe(deviceString, bundle, new AlarmSubscribeHandler());
                }
            });
    ...
    }

对于后台作业和数据管理,我使用的是 IntentService。 因此,我创建了一个名为 NotificationServiceUtil 的辅助类:

public class NotificationServiceUtil {
    ...
    public NotificationServiceUtil(Activity activity) {
        this.activity = activity;
    }

    private void _initRestApiServiceIntent (String action) {
        restApiServiceIntent = new Intent(activity, NotificationService.class);
        restApiServiceIntent.setAction(action);
    }

    public void alarmSubscribe(String deviceString, Bundle bundle, Handler handler) {
        _initRestApiServiceIntent(NotificationService.ACTION_ALARM_SET);
        restApiServiceIntent.putExtras(bundle);
        restApiServiceIntent.putExtra(NotificationService.EXTRAKEY_DEVICE_STRING, deviceString);
        restApiServiceIntent.putExtra(NotificationService.EXTRAKEY_MESSENGER, new Messenger(handler));

        activity.startActivity(restApiServiceIntent);
    }
    ...
}

清单的一部分:

    <activity 
        android:name=".activitys.MainSherlockFragmentActivity" 
        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=".activitys.TrailerDetailSherlockFragmentActivity"
       android:label="@string/app_name"/>

   <service android:name=".services.NotificationService" />

例外:

这是我在单击 SetAlarmTemperatureSherlockDialogFragment 中的保存按钮时遇到的异常:

05-31 15:29:34.084: E/AndroidRuntime(4041): FATAL EXCEPTION: main
05-31 15:29:34.084: E/AndroidRuntime(4041): android.content.ActivityNotFoundException: Unable to find explicit activity class {com.tsystems.res.itm.android/com.tsystems.res.itm.android.services.NotificationService}; have you declared this activity in your AndroidManifest.xml?
05-31 15:29:34.084: E/AndroidRuntime(4041):     at android.app.Instrumentation.checkStartActivityResult(Instrumentation.java:1404)
05-31 15:29:34.084: E/AndroidRuntime(4041):     at android.app.Instrumentation.execStartActivity(Instrumentation.java:1378)
05-31 15:29:34.084: E/AndroidRuntime(4041):     at android.app.Activity.startActivityForResult(Activity.java:2817)
05-31 15:29:34.084: E/AndroidRuntime(4041):     at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:674)
05-31 15:29:34.084: E/AndroidRuntime(4041):     at android.app.Activity.startActivity(Activity.java:2923)
05-31 15:29:34.084: E/AndroidRuntime(4041):     at com.tsystems.res.itm.android.util.NotificationServiceUtil.alarmSubscribe(NotificationServiceUtil.java:121)
05-31 15:29:34.084: E/AndroidRuntime(4041):     at com.tsystems.res.itm.android.dialogs.SetAlarmTemperatureSherlockDialogFragment$1.onClick(SetAlarmTemperatureSherlockDialogFragment.java:113)
05-31 15:29:34.084: E/AndroidRuntime(4041):     at android.view.View.performClick(View.java:2408)
05-31 15:29:34.084: E/AndroidRuntime(4041):     at android.view.View$PerformClick.run(View.java:8816)
05-31 15:29:34.084: E/AndroidRuntime(4041):     at android.os.Handler.handleCallback(Handler.java:587)
05-31 15:29:34.084: E/AndroidRuntime(4041):     at android.os.Handler.dispatchMessage(Handler.java:92)
05-31 15:29:34.084: E/AndroidRuntime(4041):     at android.os.Looper.loop(Looper.java:123)
05-31 15:29:34.084: E/AndroidRuntime(4041):     at android.app.ActivityThread.main(ActivityThread.java:4627)
05-31 15:29:34.084: E/AndroidRuntime(4041):     at java.lang.reflect.Method.invokeNative(Native Method)
05-31 15:29:34.084: E/AndroidRuntime(4041):     at java.lang.reflect.Method.invoke(Method.java:521)
05-31 15:29:34.084: E/AndroidRuntime(4041):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
05-31 15:29:34.084: E/AndroidRuntime(4041):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
05-31 15:29:34.084: E/AndroidRuntime(4041):     at dalvik.system.NativeStart.main(Native Method)

想法:

您可以在异常中看到,调用的是 startActivityForResult(),而不是 startActivity()。 我认为这可能是 support.v4 包中的一个错误,但我完全不确定。

但我可以说的是,NotificationServiceUtil 类可以正常工作,例如Activity 和 SherlockFragmentActivity。

有人知道如何解决这个问题吗?

【问题讨论】:

  • have you declared this activity in your AndroidManifest.xml?
  • 我认为我不必将 IntentService 声明为 Activity,而是将其声明为服务,我这样做了,并且可以在其他所有地方工作,但不在该 DialogFragment 内。

标签: android android-intent actionbarsherlock android-dialogfragment android-compatibility


【解决方案1】:

您正在启动一项服务,而不是一项活动。将activity.startActivity()改为activity.startService()

【讨论】:

  • IntentService 不是 Activity。
  • 我的意思是,Activity 调用 startActivity() 来启动 IntentService。这适用于我所有的活动和片段,除了 SherlockDialoagFragment。
  • 奇怪。这不应该真的有效,可能是一个框架错误
【解决方案2】:

只需检查更改,我已对您的代码进行了更改, 并且不要忘记导入

import android.app.NotificationManager;    //    in ur activity

public class NotificationServiceUtil {
    ...
    public NotificationServiceUtil(Activity activity) {
        this.activity = activity;
    }

    private void _initRestApiServiceIntent (String action) {
        NotificationManager nm = (NotificationManager) getSystemService(activity.NOTIFICATION_SERVICE);  <------ CHANGE
        restApiServiceIntent = new Intent(activity, nm.getClass());  <--- CHANGE
        restApiServiceIntent.setAction(action);
    }
    public void alarmSubscribe(String deviceString, Bundle bundle, Handler handler) {
        _initRestApiServiceIntent(NotificationService.ACTION_ALARM_SET);
        restApiServiceIntent.putExtras(bundle);
        restApiServiceIntent.putExtra(NotificationService.EXTRAKEY_DEVICE_STRING,     deviceString);
        restApiServiceIntent.putExtra(NotificationService.EXTRAKEY_MESSENGER, new Messenger(handler));

    activity.startActivity(restApiServiceIntent);
}
...
}

【讨论】:

  • 查看manifest部分,声明为服务,intent指向IntentSerivce的类,见NotificationServiceUtil
  • 你已声明为“服务”,将其更改为
  • 这根本没有意义,因为我的 IntentService 永远不会是一个 Activity。但为了证明这一点,我按照你的建议做了,这里有一个例外:05-31 16:51:11.535: E/AndroidRuntime(4127): java.lang.RuntimeException: Unable to instance activity ComponentInfo{com.tsystems.res. itm.android/com.tsystems.res.itm.android.services.NotificationService}:java.lang.ClassCastException:com.tsystems.res.itm.android.services.NotificationService
  • 我已经编辑了答案,请检查一下。 n 只要告诉我它对你有用吗?
  • 并从您的 AndroidManifest.xml 中删除具有“NotificationServic”的活动
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-23
  • 2014-10-07
  • 1970-01-01
  • 2016-01-20
相关资源
最近更新 更多