Java 当我收到短信时,我的活动将关闭

Java 当我收到短信时,我的活动将关闭,java,android-studio,Java,Android Studio,当我收到短信时,我的当前活动关闭了,但不知道为什么,我只是用adapter.notifyDataSetChanged刷新我的listview。当我发送消息时,我可以刷新它,它只起作用,但在我收到消息时不起作用 这是我的广播接收器 public class SMSReceiver extends BroadcastReceiver { String from; String msg; long time; PrintMessage pm = new Pri

当我收到短信时,我的当前活动关闭了,但不知道为什么,我只是用adapter.notifyDataSetChanged刷新我的listview。当我发送消息时,我可以刷新它,它只起作用,但在我收到消息时不起作用

这是我的广播接收器

    public class SMSReceiver extends BroadcastReceiver {

    String from;
    String msg;
    long time;
    PrintMessage pm = new PrintMessage();

    @Override
    public void onReceive(Context context, Intent intent) {

        abortBroadcast();
        Bundle bundle = intent.getExtras();
        if (bundle != null) {
            Object[] pdus = (Object[]) bundle.get("pdus");
            SmsMessage[] messages = new SmsMessage[pdus.length];
            for (int i = 0; i < pdus.length; i++) {
                // Convertir les PDUs en messages
                messages[i] = SmsMessage.createFromPdu((byte[]) pdus[i]);
            }

            // Enfin, traiter les messages
            for (SmsMessage message : messages) {
                from = message.getOriginatingAddress();
                msg = message.getMessageBody();
                time = message.getTimestampMillis();
            }
        }
       pm.printMessage();
    }
}
公共类SMSReceiver扩展了BroadcastReceiver{
串从;
串味精;
长时间;
PrintMessage pm=新的PrintMessage();
@凌驾
公共void onReceive(上下文、意图){
abortBroadcast();
Bundle=intent.getExtras();
if(bundle!=null){
Object[]pdus=(Object[])bundle.get(“pdus”);
SmsMessage[]messages=新SmsMessage[pdus.length];
对于(int i=0;i
然后我的代码显示消息的位置

    public class PrintMessage extends AppCompatActivity implements Telephony.TextBasedSmsColumns {

    String idPerso, numero, contact, msg, from;
    long time;
    Intent intent;
    ArrayList<CreateMessageAdapter> list = new ArrayList<>();
    ImageButton buttonSend;
    EditText textSMS;
    Toolbar toolbar;
    MessageAdapter adapter;
    String[] selection;
    Cursor cursor;
    TextView tv_toolbar;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_print_message);


        toolbar = (Toolbar) findViewById(R.id.tool_bar_messa);
        buttonSend = (ImageButton) findViewById(R.id.btnSend);
        textSMS = (EditText) findViewById(R.id.Et_message);
        tv_toolbar = (TextView) findViewById(R.id.tv_toolbar);

        intent = getIntent();
        idPerso = intent.getStringExtra("id");
        numero = intent.getStringExtra("numero");
        contact = intent.getStringExtra("contact");

        selection = new String[]{
                Telephony.Sms.THREAD_ID,
                Telephony.Sms.BODY,
                Telephony.Sms.TYPE,
                Telephony.Sms.DATE,
                Telephony.Sms.DATE_SENT,
        };

        printMessage();
        setSupportActionBar(toolbar);
        if (!contact.equals("no"))
            tv_toolbar.setText(contact);
        else
            tv_toolbar.setText(numero);
        tv_toolbar.setMaxWidth(550);
        getSupportActionBar().setDisplayShowTitleEnabled(false); //enlever le titre originel

        buttonSend.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {

                String sms = textSMS.getText().toString();
                try {
                    SmsManager smsManager = SmsManager.getDefault();
                    smsManager.sendTextMessage(numero, null, sms, null, null);
                    long time = System.currentTimeMillis();
//                    Cursor cTmp = cr.query(uri, selection, Telephony.Sms.THREAD_ID + "='" + idPerso + "'", null, "date ASC");
//                    cTmp.moveToFirst();
//                    int typeTmp = cTmp.getInt(2);
                    list.add(new CreateMessageAdapter(2, sms, time));
                    textSMS.setText("");
                    adapter.notifyDataSetChanged();
                    Toast.makeText(getApplicationContext(), "SMS Sent!",
                            Toast.LENGTH_LONG).show();
                } catch (Exception e) {
                    Toast.makeText(getApplicationContext(), "SMS faild, please try again later!", Toast.LENGTH_LONG).show();
                    e.printStackTrace();
                }

            }
        });
    }

    public void printMessage() {
        // Read stored sms
        Uri uri = Telephony.Sms.CONTENT_URI;
        ContentResolver cr = getContentResolver();
        cursor = cr.query(uri, selection, Telephony.Sms.THREAD_ID + "='" + idPerso + "'", null, "date ASC");
        cursor.moveToFirst();
        while (!cursor.isAfterLast()) {
            int type = cursor.getInt(2);
            String body = cursor.getString(1);
            long dateNumber = cursor.getLong(3);
            long dateNumberSent = cursor.getLong(4);
            if (type == 2)
                list.add(new CreateMessageAdapter(type, body, dateNumber));
            else if (type == 1 || type == 5 || type == 6)
                list.add(new CreateMessageAdapter(type, body, dateNumberSent));
            cursor.moveToNext();
        }
        adapter = new MessageAdapter(list, this);
        ListView lv = (ListView) findViewById(R.id.lv_message);
        lv.setTranscriptMode(ListView.TRANSCRIPT_MODE_ALWAYS_SCROLL);
        lv.setStackFromBottom(true);
        lv.setAdapter(adapter);

        lv.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
            @Override
            public boolean onItemLongClick(AdapterView<?> arg0, View arg1, int pos, long id) {
                Toast.makeText(PrintMessage.this, "long clicked pos: " + pos, Toast.LENGTH_LONG).show();

                return true;
            }
        });
    }

    public void onCreateContextMenu(final ContextMenu menu, final View v, final ContextMenu.ContextMenuInfo menuInfo) {

    }
}
public类PrintMessage扩展AppCompatActivity实现Telephony.textbasedmscscolumns{
字符串idPerso、numero、contact、msg、from;
长时间;
意图;
ArrayList=新建ArrayList();
图像按钮发送;
编辑文本短信;
工具栏;
消息适配器;
字符串[]选择;
光标;
文本视图tv_工具栏;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity\u print\u message);
工具栏=(工具栏)findViewById(R.id.tool\u bar\u messa);
buttonSend=(ImageButton)findViewById(R.id.btnSend);
textSMS=(EditText)findViewById(R.id.Et_消息);
tv_工具栏=(TextView)findViewById(R.id.tv_工具栏);
intent=getIntent();
idPerso=intent.getStringExtra(“id”);
numero=intent.getStringExtra(“numero”);
contact=intent.getStringExtra(“contact”);
选择=新字符串[]{
Telephony.Sms.THREAD_ID,
Telephony.Sms.BODY,
Telephony.Sms.TYPE,
Telephony.Sms.DATE,
Telephony.Sms.DATE_发送,
};
printMessage();
设置支持操作栏(工具栏);
如果(!contact.equals(“no”))
tv_toolbar.setText(联系人);
其他的
tv_toolbar.setText(数字);
tv_工具栏。设置最大宽度(550);
getSupportActionBar().setDisplayShowTitleEnabled(false);//初始标题
buttonSend.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
字符串sms=textSMS.getText().toString();
试一试{
SmsManager SmsManager=smsmsmanager.getDefault();
sendTextMessage(numero,null,sms,null,null);
长时间=System.currentTimeMillis();
//游标cTmp=cr.query(uri,selection,Telephony.Sms.THREAD_ID+“=”“+idPerso+””,null,“date ASC”);
//cTmp.moveToFirst();
//int typeTmp=cTmp.getInt(2);
添加(新的CreateMessageAdapter(2,短信,时间));
textSMS.setText(“”);
adapter.notifyDataSetChanged();
Toast.makeText(getApplicationContext(),“SMS已发送!”,
Toast.LENGTH_LONG).show();
}捕获(例外e){
Toast.makeText(getApplicationContext(),“SMS失败,请稍后再试!”,Toast.LENGTH\u LONG.show();
e、 printStackTrace();
}
}
});
}
public void printMessage(){
//读取存储的短信
Uri=Telephony.Sms.CONTENT\u Uri;
ContentResolver cr=getContentResolver();
cursor=cr.query(uri,selection,Telephony.Sms.THREAD_ID+“=””+idPerso+“”,null,“date ASC”);
cursor.moveToFirst();
而(!cursor.isAfterLast()){
int type=cursor.getInt(2);
字符串体=cursor.getString(1);
long dateNumber=cursor.getLong(3);
long dateNumberSent=cursor.getLong(4);
如果(类型==2)
添加(新的CreateMessageAdapter(类型、正文、日期号));
else if(type==1 | | type==5 | | type==6)
添加(新的CreateMessageAdapter(类型、正文、日期编号));
cursor.moveToNext();
}
adapter=新消息适配器(列表,此);
ListView lv=(ListView)findViewById(R.id.lv_消息);
lv.setTranscriptMode(ListView.TRANSCRIPT\u MODE\u ALWAYS\u SCROLL);
lv.从底部开始(正确);
低压设置适配器(适配器);
lv.setOnItemLongClickListener(新的AdapterView.OnItemLongClickListener(){
@凌驾
长单击公共布尔值(AdapterView arg0、视图arg1、int pos、长id){
Toast.makeText(PrintMessage.this,“长点击位置:”+pos,Toast.LENGTH_long.show();
返回true;
}
});
}
public void onCreateContextMenu(最终上下文菜单,最终视图v,最终上下文菜单。上下文菜单信息菜单信息){
}
}

替换
适配器=新消息适配器(列表,此)

with
adapter=newmessageadapter(列表,PrintMessage.this)


printMessage()

中,您收到了什么错误?没有,它给我这个错误“尝试调用虚拟方法”void com.ducha.training3.MessageAdapter.notifyDataSetChanged()”在空对象引用上,为什么为空???我加了点东西:/@S