数据、消息的传递

一、Activity之间
A、使用public static Handler,这样其他class可以轻松得到彼此之间的Handler,从而进行信息的传递。
B、后来在网上查到了两个Activity进行handler传递的方法,即利用Application,参考http://blog.csdn.net/jason0539/article/details/18055259 (转):

public class MyAPP extends Application {  
// 共享变量  
private MyHandler handler = null;  

// set方法  
public void setHandler(MyHandler handler) {  
this.handler = handler;  
}  

// get方法  
public MyHandler getHandler() {  
return handler;  
}  

}

在一个Activity里这样设置:

public void onCreate(Bundle savedInstanceState) {  

super.onCreate(savedInstanceState);  
setContentView(R.layout.main);  


mAPP = (MyAPP) getApplication();  
handler = new MyHandler();  
tv = (TextView) findViewById(R.id.tv);  
btn_to = (Button) findViewById(R.id.btn_to);  

// 设置监听器  
btn_to.setOnClickListener(new OnClickListener() {  
@Override  
public void onClick(View v) {  
// 设置共享变量  
mAPP.setHandler(handler);  
// 启动另一个Activity  
Intent intent = new Intent(MasterActivity.this,  
ToChangeViewActivity.class);  
startActivity(intent);  
}  
});  

}  

在另一个activity这样:

    protected void onCreate(Bundle savedInstanceState) {  
    super.onCreate(savedInstanceState);  
    setContentView(R.layout.show);  

    mAPP = (MyAPP) getApplication();  
    // 获得该共享变量实例  
    mHandler = mAPP.getHandler();  
    findViewById(R.id.btn_chang).setOnClickListener(new OnClickListener() {  

    @Override  
    public void onClick(View v) {  
    // 发送消息  
    mHandler.sendEmptyMessage(CHANGED);  
    ToChangeViewActivity.this.finish();  
    }  
    });  

    }  

C、另外可以使用Messenger来实现,如:
Activity1

package com.example.almoliu.handlerbetweenacti;

import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.os.Messenger;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

    Button next_btn;

    public  static final int FLAG = 1001;
    private Messenger messenger1;
    private Handler UiHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            switch (msg.what) {
                case FLAG:
                    Toast.makeText(MainActivity.this,"feafesaf",Toast.LENGTH_LONG).show();
                    break;
                default:
                    super.handleMessage(msg);
                    break;
            }
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        messenger1 = new Messenger(UiHandler);
        next_btn = (Button)findViewById(R.id.next_btn);
        next_btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent i = new Intent(MainActivity.this,Main2Activity.class);
                Bundle bundle = new Bundle();
                bundle.putBinder("IBinder",messenger1.getBinder());
                i.putExtras(bundle);
                startActivity(i);
            }
        });
    }

}

Activity2

public class Main2Activity extends AppCompatActivity {

    MyHandler mHandler1 = null;

    Button send_btn;
    private Messenger messenger2;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main2);
        Intent  i = getIntent();
        Bundle bundle = i.getExtras();
        messenger2 = new Messenger(bundle.getBinder("IBinder"));


        send_btn = (Button)findViewById(R.id.button);
        send_btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Message msg = Message.obtain(null,MainActivity.FLAG);
                try {
                    messenger2.send(msg);
                } catch (RemoteException e) {
                    e.printStackTrace();
                }
            }
        });
    }
}

D、利用公共类:
该方法还适合于Activity与Service进行信息的交换,详细请见Activity如何与Service进行信息交换。
E、利用Broadcast Receiver,该方法亦可使用于Activity与静态注册的Broadcast Receiver进行信息的传递,详细请参考 此处。

二、Activity与Broadcast Receiver
Broadcast Receiver:注册方式有两种,一种是静态的,一种是动态的。
对于动态的,在哪个Activity注册,就要在这个Activity取消注册,并且对于 其Context尽量不要使用getApplicationContext()方法,尽量使用注册该Broadcast Receiver的Context。这样,该Broadcast Receiver很容易和该Activity进行信息的传递,进而和其他Activity进行信息传递。比较简单,且易操作。
但是对于静态的,我理解为全局的Broadcast Recevier,首先要在AndroidManifest里进行注册,而对于和Activity进行信息传递则显得比较难办。
使用Handler比较容易解决,但是怎么在Boradcast Receiver中获得Activity的Handler?使用static handler 可以实现,但是带了了其他问题,不推荐。
刚开始我犯了一个低级错误,在这里也记一下吧:首先我注册了一个静态的Broadcast Receiver:

public class Receiver extends BroadcastReceiver {
    private static final String TAG = "Receiver";

    public static final String MY_ACTION = "com.example.almoliu.bplayer.action";

    private Handler uiHandler = null;
    public Receiver() {

    }

    @Override
    public void onReceive(Context context, Intent intent) {
        // TODO: This method is called when the BroadcastReceiver is receiving
        // an Intent broadcast.
        String action = intent.getAction();
        if(BluetoothAdapter.ACTION_STATE_CHANGED.equals(action)) {
            int extrasState = intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, -1);
            if(extrasState==BluetoothAdapter.STATE_OFF) {
                Log.d(TAG, "the bluetooth has been turned off...");
                Intent i = new Intent(MY_ACTION);
                context.sendBroadcast(i);
            }
        }
    }
}

在一个Activity中:

 IntentFilter i = new IntentFilter(Receiver.MY_ACTION);
        registerReceiver(mBroadcastReceiver,i);

三、 Activity与Service
A、该种方法也适用于activity之间的通信:
在activity
TaskService.start(uiHandler, this);
在该service内或者其他Activity中:
public static void start(Handler handler,Context context) {
uiHandler = handler;
mContext = context;
Intent startIntent = new Intent(context,TaskService.class);
context.startService(startIntent);
}

public static void stop(Context context) {
    Intent stopIntent = new Intent(context,TaskService.class);
    context.stopService(stopIntent);
}
@Override
public void onCreate() {
    super.onCreate();
    mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
    if((mBluetoothAdapter==null)||(!mBluetoothAdapter.isEnabled())) {
        stopSelf();
        return;
    }
}

B、公共类方法:
public class Task {

private Handler mHandler;
private Context mContext;
private int mTaskId;

public static final int TASK_ACCEPT_ON = 0;
public static final int TASK_CONNECT_ON = 1;
public static final int TASK_CHAT_ON =2;
public static final int TASK_REC_MESSAGE = 3;
public static final int TASK_SEND_MESSAGE = 4;

private Object[] parameter;

public Task(Handler handler,Context context,int taskId,Object[] parameter) {
    this.mContext = context;
    this.mHandler = handler;
    mTaskId = taskId;
    this.parameter = parameter;
}
public Handler getHandler() {
    return mHandler;
}
public int getTaskId() {
    return  mTaskId;
}

public Object getObject(int pos) {
    if(pos<=parameter.length-1)
        return parameter[pos];
    else
        return null;
}

}
只需要在activity或者service里创建一个方法
public static void newTask(Task task) {
synchronized (tasksList) {
tasksList.add(task);
}
}
C、使用Broadcast Receiver,方法同Activity与静态注册的Broadcast Receiver类似。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值