Android开发分享

Android:Activity与Fragment、Servic

2019-05-09  本文已影响0人  987edf3ecfa4

1、Activity向Fragment传递数据?

2、Fragment将数据传递给Activity?

基本方法:接口回调;

public class fragment1 extends Fragment implements View.OnClickListener{
    //2.1、用来与外部Activity交互,获取宿主Activity
    private FragmentListener listener;
    //1、首先定义所有Activity必须实现的接口方法。
    public interface FragmentListener{
        void process(String str);
    }
    //fragment被加载到Activity时回调
    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        //判断activity是否实现了FragmentListener方法
        if (activity instanceof FragmentListener){
            listener = (FragmentListener) activity;//获取到宿主Activity,并给你赋值。
        }else{
            throw new IllegalArgumentException("activity must implements Fragment");
            //否则的话,会抛出activity must implements Fragment[Activity必须关联Fragment]异常。
        }
    }
    @Override
    public void onClick(View v) {
        listener.process(str:"我是接口");//3.1、执行回调
    }
    //把传递进来的activity对象释放掉
 
    @Override
    public void onDetach() {
        super.onDetach();
        listener = null;//进行销毁,避免造成内存泄漏。
    }
}
public class FragmentActivity1 extends Activity implements fragment1.FragmentListener {
 
        @Override
        public void process(String str) {
            // TODO: 2019/3/19
        }
}

除此以外我们想要完成Activity与Fragment之间的数据传递还可以使用:第三方框架Eventbus、广播。

3、Activity与Service数据通信?

三种方式:

1、绑定服务,利用ServiceConnection类,同时让Activity实现该类,重写该类中的两个方法,即绑定成功()和绑定失败()。

2、简单通信,利用Intent进行传值(Intent组件在activity之间、activity与fragment之间数据通信都会用到),该方法简单,但是也只能传递较简单的数据。

//在ServiceActivity中进行启动和停止服务操作
     
   @Override
        public void onClick(View v){
            switch (v.getId()){
                case R.id.btStartService://启动服务
                    intent.putExtra(name:"data",value:"data");//(key,value)
                    startService(intent);
                    break;
                case R.id.btStopService://启动服务
                    stopService(intent);
                    break;
            }
        }
//Service中
public int onStartCommand(final Intent intent,int flags,int startId){
    data = intent.getStringExtra(name:"data");//接收从Activity中传递来的值。
    return super.onStartCommand(intent,flags,startId);
} 

3、利用callback接口,将Handler来监听服务中的进程的变化(会有子线程到主线程的切换,因此用到了Handler)。

public interface Callback{
    void onDataChange(String data);
}
public class Binder extends android.os.Binder{
    public void setData(String data){
        MyService.this.data = data;
    }
    public MyService getMyService(){
        return MyService.this;
    }
}
    private Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg){
            super.handleMessage(msg);
        }
    };
     //一旦绑定成功就会执行该函数
    @Override
    public void onServiceConnected(ComponentName componentName,Ibinder iBinder){
        myBinder = (MyService.Binder) iBinder;
        myBinder.getMyService().setCallback(new MyService.callback() {
            Message msg = new Message();
            Bundle b = new Bundle();
            b.putString("data",data);
            msg.setData(b);
            handler.sendMessage(msg);
        });
    }
上一篇下一篇

猜你喜欢

热点阅读