如何通过活页夹将服务发送到 API 级别 14 的片段?
Posted
技术标签:
【中文标题】如何通过活页夹将服务发送到 API 级别 14 的片段?【英文标题】:How to send a service via a binder to a fragment on API level 14? 【发布时间】:2016-07-19 13:58:32 【问题描述】:我在 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 上构建我的项目时,我不明白如何将我的服务(我的活页夹)发送到片段。
【问题讨论】:
【参考方案1】:因为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;
【讨论】:
【参考方案2】:之所以出现此问题,是因为后来仅在 API 18 上添加了 bundle.putBinder(Binder)
。
因此,在具有 API 14 的设备中,该代码将失败,因为这些设备上不存在该方法。
也许,您可以在 Fragment 中创建一个公共方法并将其称为:
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);
或
您可以从以下活动中获取活页夹:
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();
【讨论】:
【参考方案3】:您可以使用BundleCompat
从Bundle
中放置和获取IBinder
。
见:BundleCompat Documentation
【讨论】:
以上是关于如何通过活页夹将服务发送到 API 级别 14 的片段?的主要内容,如果未能解决你的问题,请参考以下文章
如何通过 cURL/PHP 使用 PUT 方法将 JSON 数据发送到 API