Android 中activity中传递数据的方式

方式一 通过Intent进行数据传递(日后更新)



方式二 通过剪切板进行数据的传递



首先在第一个Activity中,设置所要进行传递的数据


  
/**
 * 通过剪贴板传递字符串数据的操作
 *
 */
    private void passingDataFunction() {

        final Intent intent = new Intent(IntentToDataActivity.this,IntentToDataActivity2.class);
        //获取剪切板的管理对象
        ClipboardManager clipboardManager = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
        //向剪切板中保存字符串
        clipboardManager.setText("通过剪切板传递的数据 、、、");

        startActivity(intent);
    }


那么在第二个activity中对应的接收数据的方法 为 


 /**
     * 获取普通字符串的信息数据
     */
    private void getClipboarDatas() {
        ClipboardManager clipboardManager = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
        //获取传递过来的字符串数据
        final String string = clipboardManager.getText().toString();
    }

可以看到通过这种方式进行数据的传递只是传递简单的字符串类型的了,当然也可以传输 boolean 与int 类型的,只不过是要进行一下数据类型的转换


下面是通过剪切板的方式传递对象数据信息的方法 


基本的思路就 是将对象信息进行64位字节数据的转换为字符类型进行传递,然后再接收到,再转换回来


/**
     * 通过剪贴板传递对象数据的操作
     * 基本思路是先将对象信息通过64位编码方式转换成字符串,然后再进行数据的传递
     *
     */
    private void passingClassDataFunction() {

        final Intent intent = new Intent(IntentToDataActivity.this,IntentToDataActivity2.class);
        //获取剪切板的管理对象
        ClipboardManager clipboardManager = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
        //对象信息
        final Datas datas = new Datas();
        datas.id = "lk";
        datas.name = "dd";
        //将对象信息进行String类型的编码
        final ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        String byte64String = " ";
        try {
            final ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream);
            objectOutputStream.writeObject(datas);
            //转换字符串
            byte64String = Base64.encodeToString(byteArrayOutputStream.toByteArray(),Base64
                    .DEFAULT);
            objectOutputStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

        //向剪切板中保存字符串
        clipboardManager.setText("通过剪切板传递的对象信息数据 、、、"+byte64String);

        startActivity(intent);
    }



那么在对应开启的activity中 对就的接收数据的方法为 


/**
     * 获取对象的传递信息数据
     */
    private void getClassClipboarDatas() {
        ClipboardManager clipboardManager = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
        //获取传递过来的字符串数据
        final String string = clipboardManager.getText().toString();
        //将获取的64位编码格式的String进行还原操作
        byte[] buffer = Base64.decode(string,Base64.DEFAULT);

        final ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(buffer);
        try {
            final ObjectInputStream objectInputStream = new ObjectInputStream(byteArrayInputStream);
            //将byte数据 还原成data对象信息
            IntentToDataActivity.Datas  datas = (IntentToDataActivity.Datas) objectInputStream.readObject();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }

    }





方式三 通过静态变量进行数据的传递



方式四 通过全局变量进行数据的传递


方式五 通过EventBus进行数据的传递

使用方法:

第一步:引入EventBus 

 compile 'org.greenrobot:eventbus:3.0.0'



第二步: 注册eventbus


public class MainActivity extends Activity {
    private Button btn, fragment_btn;
    private TextView service_tv;
    private TextView mainTextView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        /**
         * 进行注册
         */
        EventBus.getDefault().register(this);
        btn = (Button) findViewById(R.id.btn);
        mainTextView = (TextView) findViewById(R.id.tv_main_show_information);

        /**
         * activity之间数据传递
         */
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(MainActivity.this,
                        SecondActivity.class);
                startActivity(intent);
            }

        });

        /**
         * 与服务之间的数据传递
         */
        startService(new Intent(this, EventTestService.class));
    }

    @Subscribe
    public void onEventMainThread(UserEvent event) {
        mainTextView.setText(event.getUserName());
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        EventBus.getDefault().unregister(this);
    }


}


通过post方法发送相关数据


public class SecondActivity extends Activity {
    private Button btn;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);
        
        btn = (Button) findViewById(R.id.btn);
        
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                /**
                 * 封装传递的数据
                 */
                final UserEvent ue = new UserEvent();
                ue.setUserName("142353");
                EventBus.getDefault().post(ue);
                finish();
            }
        });
    }
}


public class EventTestService extends Service {
    public EventTestService() {
    }


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

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

        new MyServerThread().start();

        return super.onStartCommand(intent, flags, startId);
    }

    class MyServerThread extends Thread {
        @Override
        public void run() {
            EventBus.getDefault().post(new UserEvent("hi,我是Service"));
        }
    }
}

第三步:注销eventbus 

在ondestroy方法中 进行注销 


第四步:proguard-rules.pro文件中的操作


#EventBus
 -keepclassmembers class ** {
    public void onEvent*(**);
    void onEvent*(**);
 }


注:上面实例中使用到的UserEvent是封装数据的实体类










未完待续

早起的年轻人 CSDN认证博客专家 移动开发 项目管理 Java
只要用心去做,每一件事情还是有可能成功的,当然成功是没有界限的,只不过是达到自己心里的那个目标,公众号:我的大前端生涯,一个爱喝茶的程序员,通常会搞搞SpringBoot 、Herbinate、Mybatiys、Android、iOS、Flutter、Vue、小程序等.
©️2020 CSDN 皮肤主题: 代码科技 设计师:Amelia_0503 返回首页