如何通过活页夹将服务发送到 API 级别 14 上的片段?

How to send a service via a binder to a fragment on API level 14?

我在 Android 4.4.4 上制作了一个 Android 应用程序,我想在 Android 4.0.0 上开发它。我在将服务(我的活页夹)发送到片段时遇到问题。

在 Android 4.4.4 我使用以下几行:

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();

但是当我尝试使用 Android 4.0.0 构建我的项目时,出现以下错误: 调用需要 API 级别 18(当前最小值为 14):android.os.Bundle#putBinder less (Ctrl + F1)

当我尝试在 Ice Scream Sandwich 上构建项目时,我不明白如何将我的服务、活页夹发送到片段。

因为 Bundle.putBinder() 是 API 18+,所以您必须以不同的方式进行。最简单的方法是让您的 Fragment 定义一个您的 Activity 必须实现的回调接口:

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;
    }
}

出现此问题是因为 bundle.putBinder(Binder) 是稍后在 API 18 上添加的。 因此,在 API 14 的设备中,该代码将失败,因为这些设备上不存在该方法。

或许,您可以在 Fragment 中创建一个 public 方法并像这样调用它:

public class AddTrashFragment extends Fragment {
    private Binder binder;

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

然后在您的 activity 中,您调用:

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

addTrashFragment.setBinder(binder);

您可以从 activity 获取活页夹,例如:

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();
    }
}

您可以使用 BundleCompatBundle 中放置和获取 IBinder

参见:BundleCompat Documentation