在Activity中建立Bundle,将数据以putString(key,value)形式放入bundle中,最后经过setArguments(bundle)方法,将其关联,在Fragment【与Activity依附的Fragment】中直接经过getArguments().getString()来获取。android
直接经过强转将其强转为Activity,即调用Fragment所依附的Activity中的方法。面试
基本方法:接口回调;性能优化
在fragment定义一个内部回调接口,再让包含这个FragmentActivity实现这个回调接口,fragment就能够调用这个接口中的方法,将数据传递给Activity。bash
Activity实现完接口后,又怎样把数据传递给Fragment,利用Fragment刚添加到Activity时的时候调用的生命周期方法的onAttch()方法,咱们就在该方法中检查相应的Activity是否实现了Fragment当中定义的内部接口。就是对它进行了类型转换,而后赋值给咱们Fragment中定义的接口。架构
当一个Fragment从Activity当中剥离时,就会走到生命周期的onDetach()方法,在此要将传递进来的Activity对象释放掉,不然会影响Acitvity销毁,产生内存泄漏。框架
public class fragment1 extends Fragment implements View.OnClickListener{
//2.一、用来与外部Activity交互,获取宿主Activity
private FragmentListener listener;
//一、首先定义全部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.一、执行回调
}
//把传递进来的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、广播。ide
三种方式:函数
一、绑定服务,利用ServiceConnection类,同时让Activity实现该类,重写该类中的两个方法,即绑定成功()和绑定失败()。性能
二、简单通讯,利用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);
}
复制代码
三、利用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);
});
}
复制代码
最后送福利了,如今关注我而且加入群聊能够获取包含源码解析,自定义View,动画实现,架构分享等。 内容难度适中,篇幅精炼,天天只需花上十几分钟阅读便可。 你们能够跟我一块儿探讨,欢迎加群探讨,有flutter—性能优化—移动架构—资深UI工程师 —NDK相关专业人员和视频教学资料,还有更多面试题等你来拿~ 群号:661841852