广播接收者实现跨APP的聊天与数据传递

广播接收者

1.自Android 3.1之后,所有新安装但未被执行过的apk,以及那些被用户强行停止的apk,都会处于stopped状态。这个状态下,apk中的广播接收者,均处于未激活状态, 无法履行监听功能。
2.注册分为两种,一种为静态注册,一种为动态注册
3.广播有有序广播与无序广播

有序广播

1.广播消息是按照一定的顺序传达的,高优先级的先得到广播消息,低优先级的后得到
2.高优先级的可以拦截广播消息或者修改广播消息
3.效率比较低

无序广播

1.广播消息没有顺序,同时接受广播消息
2.不可以修改广播消息
3.效率高

静态注册

是写在注册清单文件中,永久存在,只要是在该项目下都可以使用
<!--收音机-->
        <receiver android:name=".MyReceiver">
            <!--调频-->
            <intent-filter>
                <action android:name="android.bawei.action.customer" />
            </intent-filter>
        </receiver>

动态注册

动态注册的广播,随着activity的存在而存在死亡而死亡。
public class MainActivity extends AppCompatActivity {
    private MyReceiver receiver;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        receiver=new MyReceiver();
        regeister();//注册广播
    }
    private void regeister() {
        //TODO 1:创建过滤器
        IntentFilter intentFilter=new IntentFilter();
        //TODO 2:调频:
        intentFilter.addAction("android.bawei.action.customer");
        //TODO 3:注册: 给这个Activity注册
        registerReceiver(receiver,intentFilter);
    }
    @Override
    protected void onDestroy() {
        super.onDestroy();
        unregisterReceiver(receiver);//解除注册
    }
}

广播代码案例

public class MyReceiver extends BroadcastReceiver{
    @Override
    public void onReceive(Context context, Intent intent) {
        //TODO 1:获取action
        String action = intent.getAction();
        if("android.bawei.action.customer".equals(action)){
            Bundle bundle = intent.getExtras();
            int msg=bundle.getInt("msg");
            Log.i("广播", "接受到了一个广播: "+msg);

        }
    }
}

跨APP的传值与聊天

广播可以实现跨APP传递值,所以我们只需要将聊天的内容传递过去就可以。

设置自定义的多布局适配器
package com.example.day10_send;

import android.content.Context;
import android.content.IntentFilter;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;

import java.util.ArrayList;

public class MyAdapter_send extends BaseAdapter {

    Context context;
    ArrayList<String> list;

    public MyAdapter_send(Context context, ArrayList<String> list) {
        this.context = context;
        this.list = list;
    }

    @Override
    public int getCount() {
        return list.size();
    }

    @Override
    public Object getItem(int position) {
        return null;
    }

    @Override
    public long getItemId(int position) {
        return 0;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        String msg = list.get(position);
        String[] sp = msg.split("#");

        if(sp[0].equals("left")){
            MyHolderL myHolderL = null;
            if(convertView == null){
                convertView = View.inflate(context,R.layout.my_item_send,null);
                myHolderL = new MyHolderL();
                myHolderL.left = convertView.findViewById(R.id.tv1);
                convertView.setTag(myHolderL);
            }else{
                myHolderL = (MyHolderL)convertView.getTag();
            }

            if(myHolderL != null){
                myHolderL.left.setText(sp[1]);
            }
        }else if(sp[0].equals("right")){
            MyHolderR myHolderR = null;
            if(convertView == null){
                convertView = View.inflate(context,R.layout.my_item_right,null);
                myHolderR = new MyHolderR();
                myHolderR.right = convertView.findViewById(R.id.tv1_right);
                convertView.setTag(myHolderR);
            }else{
                myHolderR = (MyHolderR)convertView.getTag();
            }

            if(myHolderR != null){
                myHolderR.right.setText(sp[1]);
            }
        }

        return convertView;
    }
    public class MyHolderR{
        TextView right;
    }
    public  class MyHolderL{
        TextView left;
    }
}

静态注册清单文件
<receiver android:name=".BroadCastRecevierSend">
            <intent-filter>
                <action android:name="jzh"/>
            </intent-filter>
        </receiver>
聊天的主类
package com.example.day10_send;

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;

import java.util.ArrayList;

public class Activity_send extends AppCompatActivity {
    Button btn;
    EditText txt;
    ListView lv;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_send);
        btn = findViewById(R.id.send_btn2);
        txt = findViewById(R.id.send_txt);
        lv = findViewById(R.id.lv);
        Share.adapterSend = new MyAdapter_send(Activity_send.this, Share.list);
        lv.setAdapter(Share.adapterSend);
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String s = txt.getText().toString();
                Share.list.add("right#"+s);
                Share.adapterSend.notifyDataSetChanged();
                Intent intent = new Intent("jiaozihan");
                intent.putExtra("name","left#"+s);
                sendBroadcast(intent);
            }
        });
    }
}

共享类
public static ArrayList<String> list = new ArrayList<>();
    public static MyAdapter_send adapterSend ;

写共享类的原因是因为方便适配器在主线程中可以实时更新截面数据,并且方便往集合中添加新值。

广播类
package com.example.day10_send;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;

public class BroadCastRecevierSend extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();//获取调频
        if(action.equals("jzh")){//判断调频是否符合要求
            String name = intent.getStringExtra("name");
            Share.list.add(name);
            Share.adapterSend.notifyDataSetChanged();
            Log.i("name###",name);
        }
    }
}

另一个APP代码与上面的相同,改一些布局ID和一些不用的变量名即可。

猜你喜欢

转载自blog.csdn.net/qq_44946212/article/details/90301227