3 ways of data communication between Activtiy

Data communication between activities Intent / bundle

The first activity jump code

		Bundle bundle = new Bundle();
        bundle.putString("name","mile");
        bundle.putInt("age",18);
        Intent intent = new Intent(this,MainActivity.class);
        intent.putExtras(bundle);
        startActivity(intent);

MainActivity accept code

Intent intent = getIntent();
String name = intent.getStringExtra("name");
int age = intent.getIntExtra("age",0)

Activity and Fragment communication

1. Activity award data is passed to Fragment

1. Bundle
2. Define a method directly in Activity


Pass data code in bundle FragmentActivity

public class FragmentActivity extends Activity {
    @Override
    public void onCreate(@Nullable Bundle savedInstanceState, @Nullable PersistableBundle persistentState) {
        super.onCreate(savedInstanceState, persistentState);
        Bundle bundle = new Bundle();
        bundle.putString("id","sssss");
        Fragment fragment = null;//伪代码
        fragment.setArguments(bundle);
    }
}

MyFragment get data code

public class MyFragment extends Fragment {
    public String productId;

    @Override
    public void onStart() {
        super.onStart();
        if (isAdded()){//判断Fragment已经衣服Activity
            productId = getArguments().getString("id");

        }
    }
}

Define a method directly in Activity

public class FragmentActivity extends Activity {
    @Override
    public void onCreate(@Nullable Bundle savedInstanceState, @Nullable PersistableBundle persistentState) {
        super.onCreate(savedInstanceState, persistentState);

    }


    public String getTitles(){
        return "title";
    }
}

Get in Fragment

public class MyFragment extends Fragment {
    public String title;

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        title = ((FragmentActivity)activity).getTitles();
    }
}

2. Fragment award data is passed to Activity (not mentioned for data transmission such as broadcasting)

Interface callback
1. Define an internal callback interface
in the fragment 2. Fragment method onAttach()
3. Call the onDetach method. At this time, release the passed activity object

Fragment code

public class MyFragment extends Fragment implements View.OnClickListener{


    //一、定义了所有activity必须实现的接口方法
    public interface FragmentListener{
        void process(String str);
    }
    //二、定义用来与外部activity交互,获取到宿主activity
    private FragmentListener listener;

    //当Fragment被加载到activity的时候会被回调
    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        if (activity instanceof FragmentListener){
            listener = (FragmentListener) activity; //二、二获取到宿主activity并赋值
        }else {

            throw new IllegalArgumentException("activity must implements FragmentListener");
        }
    }

    @Override
    public void onClick(View view) {
        listener.process("我是接口回调数据");//三、执行回调

    }

    @Override
    public void onDetach() {
        super.onDetach();
        listener = null; //四、释放对象
    }
}

Activity code


public class FragmentActivity extends Activity implements MyFragment.FragmentListener{
    @Override
    public void onCreate(@Nullable Bundle savedInstanceState, @Nullable PersistableBundle persistentState) {
        super.onCreate(savedInstanceState, persistentState);

    }




    @Override
    public void process(String str) {

        Toast.makeText(this,"从fragment中获取到的数据:"+str,Toast.LENGTH_SHORT).show();
    }
}

Three ways of data communication between Activity and Service

1. Bind the service, use the ServiceConnection class
2. Simple communication, use the Intent for value transfer
3. Define a callback interface to monitor changes in the process of the service

One, bind the service, use the
code in ServiceConnection class Activity

public class FragmentActivity extends Activity implements ServiceConnection,View.OnClickListener{
    public MyService.Binder myBinder = null;// 1
    private Intent intent;
    @Override
    public void onCreate(@Nullable Bundle savedInstanceState, @Nullable PersistableBundle persistentState) {
        super.onCreate(savedInstanceState, persistentState);
        intent = new Intent(this,MyService.class);

    }


    @Override
    public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
        myBinder = (MyService.Binder)iBinder;//2

    }

    @Override
    public void onServiceDisconnected(ComponentName componentName) {

    }

    @Override
    public void onClick(View view) {
        switch (view.getId()){
            case R.id.all://启动服务
                if (myBinder != null)
                    myBinder.setData("启动服务了"); //数据通信
                break;
            case R.id.ALT://终止服务
                stopService(intent);
                break;
        }
    }

code in service


public class MyService extends Service {
    public String data = "服务器正在执行中";
    public MyService() {
    }

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return new Binder();
    }

    public class Binder extends android.os.Binder{
        public void setData(String data){
            MyService.this.data = data;
        }
    }


    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {

        data = intent.getStringExtra("data");
        return super.onStartCommand(intent,flags,startId);
    }
}

Two, simple communication, use Intent to pass the
code in the activity


public class FragmentActivity extends Activity implements View.OnClickListener{
    public MyService.Binder myBinder = null;// 1
    private Intent intent;
    @Override
    public void onCreate(@Nullable Bundle savedInstanceState, @Nullable PersistableBundle persistentState) {
        super.onCreate(savedInstanceState, persistentState);
        intent = new Intent(this,MyService.class);

    }


    @Override
    public void onClick(View view) {
        switch (view.getId()){
            case R.id.all://启动服务
                intent.putExtra("data","data");
                startService(intent);
                break;
            case R.id.ALT://终止服务
                stopService(intent);
                break;
        }
    }
}

service code


public class MyService extends Service {
    public String data = "服务器正在执行中";
    public MyService() {
    }

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return new Binder();
    }


    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {

        data = intent.getStringExtra("data");
        return super.onStartCommand(intent,flags,startId);
    }
}

Three, define a callback interface to monitor changes in the process of the service

service code


public class MyService extends Service {
    public String data = "服务器正在执行中";
    Callback callback;
    public MyService() {
    }

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return new Binder();
    }

    public class Binder extends android.os.Binder{
        public void setData(String data){
            MyService.this.data = data;
        }

        public MyService getMyService(){
            return MyService.this;
        }
    }


    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {

        data = intent.getStringExtra("data");
        return super.onStartCommand(intent,flags,startId);
    }
    public void setCallback(Callback callback){
        this.callback = callback;
    }

    public Callback getCallback(){

        return callback;
    }

    public interface Callback {
        void onDataChange(String data);
    }
}

code in activity


public class FragmentActivity extends Activity implements View.OnClickListener,ServiceConnection{
    public MyService.Binder myBinder = null;// 1
    private Intent intent;
    @Override
    public void onCreate(@Nullable Bundle savedInstanceState, @Nullable PersistableBundle persistentState) {
        super.onCreate(savedInstanceState, persistentState);
        intent = new Intent(this,MyService.class);

    }


    @Override
    public void onClick(View view) {
        switch (view.getId()){
            case R.id.all://启动服务
                intent.putExtra("data","data");
                startService(intent);
                break;
            case R.id.ALT://终止服务
                stopService(intent);
                break;
        }
    }

    @Override
    public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
        myBinder = (MyService.Binder) iBinder;
        myBinder.getMyService().setCallback(new MyService.Callback() {
            @Override
            public void onDataChange(String data) {
                //这里能拿到服务的数据可以通过handle 更新界面
            }
        });
    }

    @Override
    public void onServiceDisconnected(ComponentName componentName) {

    }
}

Guess you like

Origin blog.csdn.net/yanwenyuan0304/article/details/108103426