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) {
}
}