2016-07-19 3 views
1

Android 4.4.4에서 Android 앱을 만들었으며 Android 4.0.0에서 개발하고 싶습니다. 바인더에 서비스 바인더를 보내는 데 문제가 있습니다. 나는 다음과 같은 라인을 사용하는 안드로이드 4.4.4에API 레벨 14의 프래그먼트에 바인더를 통해 서비스를 보내는 방법

:

AddTrashFragment addTrashFragment = new AddTrashFragment(); 
Bundle bundle = new Bundle(); 
bundle.putParcelable("bitmap", bitmap2); 
bundle.putString("fileName", fileName); 
bundle.putBinder("binder", binder); 
addTrashFragment.setArguments(bundle); 

FragmentManager fragmentManager = getSupportFragmentManager(); 
fragmentManager.beginTransaction().replace(R.id.relativeLayout,addTrashFragment).addToBackStack(null).commitAllowingStateLoss(); 

하지만을 나는 안드로이드 4.0.0 내 프로젝트를 빌드 할 때이 다음과 같은 오류 : 전화는 API 레벨 18 (현재의 분을 필요로 14) : android.os.Bundle # putBinder less (Ctrl + F1)

Ice Scream Sandwich에서 프로젝트를 빌드하려고 할 때 바인더에 내 서비스를 보내는 방법을 모르겠다.

답변

1

Bundle.putBinder()은 API 18+이기 때문에 다른 방식으로해야합니다. 간단한 가지고하는 것입니다 Fragment 당신의 Activity가 구현해야하는 콜백 인터페이스를 정의 bundle.putBinder(Binder)는 API 18 만에 나중에 추가 되었기 때문에

public class MyFragment extends Fragment { 
    MyFragment.Callback cb; 

    public interface Callback { 
     Binder getServiceBinder(); 
    } 
    ... 

    public void onAttach(Context context) { 
     try { 
      cb = (MyFragment.Callback)context; 
     } catch (ClassCastException e) { 
      Log.e(TAG, "Activity (Context) must implement Callback"); 
      throw new RuntimeException(); 
     } 
    } 
} 

public class MyActivity extends Activity implements MyFragment.Callback { 
    private Binder mService; 
    ... 

    public Binder getServiceBinder() { 
     return mService; 
    } 
} 
1

문제가 일어나고 있습니다. 따라서 API 14가있는 기기에서는 해당 기기에 해당 메소드가 존재하지 않으므로 해당 코드가 실패합니다.

어쩌면, 당신이 좋아하는 당신의 조각에 공개 방법을 생성하고 호출 할 수 있습니다 :

public class AddTrashFragment extends Fragment { 
    private Binder binder; 

    public void setBinder(Binder binder) { 
     this.binder = binder; 
    } 
} 

그리고 당신의 활동을, 당신은 전화 :

AddTrashFragment addTrashFragment = new AddTrashFragment(); 
Bundle bundle = new Bundle(); 
bundle.putParcelable("bitmap", bitmap2); 
bundle.putString("fileName", fileName); 
addTrashFragment.setArguments(bundle); 

addTrashFragment.setBinder(binder); 

또는

당신 다음과 같은 활동에서 Binder를 얻을 수 있습니다.

public class MainAcitivity extends Activity { 
    public Binder getBinder() { 
     return binder; 
    } 
} 

및 귀하의 조각 :

public AddTrashFragment extends Fragment { 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 

     Binder binder; 
     Activity activity = getActivity(); 
     if(activity != null && activity instanceof MainActivity) 
      binder = ((MainAcitivity)activity).getBinder(); 
    } 
} 
관련 문제