2

场景:调用内startActivity(intentServiceIntent)(夏洛特)DialogFragment导致ActivityNotFoundException

SherlockFragmentActivity显示SherlockFragment。 SherlockFragment显示SherlockDialogFragment。

Verions:

  • 生成API:谷歌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类从例如活动和SherlockFragmentActivity。

有没有人有一个想法如何解决这个问题?

+0

'您是否在AndroidManifest.xml中声明了此活动?' –

+0

我不认为我必须声明一个IntentService作为一个活动,而是作为服务,我做了什么,哪些工作从其他地方,但不在该DialogFragment内。 – stefanjunker

回答

2

你开始服务,而不是一个活动。将activity.startActivity()更改为activity.startService()

+0

IntentService不是活动。 – SeanPONeil

+0

我的意思是,调用startActivity()来启动IntentService的Activity。 适用于我所有的活动和片段,除了来自SherlockDialoagFragment。 – stefanjunker

+0

奇怪。这不应该真的有效,可能是一个框架错误 – SeanPONeil

1

刚查的变化,我对我们的代码, 制成,不要忘记导入

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); 
} 
... 
} 
+0

查看清单的一部分,将其声明为服务,并将意图定向到IntentServce的类,请参阅NotificationServiceUtil – stefanjunker

+0

u hav声明为“service”将其更改为

+0

,根本没有意义,因为我的IntentService永远不会是一个活动。但要证明这一点,我做了你的建议,这里是例外: 05-31 16:51:11.535:E/AndroidRuntime(4127):java.lang.RuntimeException:无法实例化活动ComponentInfo {com.tsystems .res.itm.android/com.tsystems.res.itm.android.services.NotificationService}:java.lang.ClassCastException:com.tsystems.res.itm.android.services.NotificationService – stefanjunker

相关问题