如何通过活页夹将服务发送到 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】:

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

见:BundleCompat Documentation

【讨论】:

以上是关于如何通过活页夹将服务发送到 API 级别 14 的片段?的主要内容,如果未能解决你的问题,请参考以下文章

当服务器向客户端发送消息时,android本机活页夹崩溃

如何将 API 级别添加到 NDK?

如何通过 cURL/PHP 使用 PUT 方法将 JSON 数据发送到 API

在从浏览器发送请求时无法绑定对象列表的属性

Android Binder IPC addService:有没有办法再次删除服务?

如何使用 swift 将数据发送到服务器(api)