android短信实时获取与视图的刷新

首先呢既然需要获取手机的短信,首先要创建自己的BroadcastReceiver类继承BroadcastReceiver;

public class MYSMSBroadcastReceiver extends BroadcastReceiver {
private static final String ACTION = "android.provider.Telephony.SMS_RECEIVED";

@Override
public void onReceive(Context context, Intent intent) {
/*MySqliteOpenHelper helper = new MySqliteOpenHelper(context, MySqliteOpenHelper.SQlite.DB_NAME, null, 1);
//获得数据库对象helper.get...
//可读,并且可写---的数据库:   磁盘满的情况,写不进去,不写了,一般情况使用这个
*//*db = helper.getReadableDatabase();*/
if (intent.getAction().equals(ACTION)) {
StringBuffer SMSAddress = new StringBuffer();
StringBuffer SMSContent = new StringBuffer();
Bundle bundle = intent.getExtras();
if (bundle != null) {
Object[] pdusObjects = (Object[]) bundle.get("pdus");
SmsMessage[] messages = new SmsMessage[pdusObjects.length];
for (int i = 0; i < pdusObjects.length; i++) {
messages[i] = SmsMessage
.createFromPdu((byte[]) pdusObjects[i]);
}
for (SmsMessage message : messages) {
SMSAddress.append(message.getDisplayOriginatingAddress());
SMSContent.append(message.getDisplayMessageBody());

Log.e("aaaaaa","手机号:"+SMSAddress.toString()+"短信内容:"+SMSContent);

}
}
}
}


上面就是自己BroadcastReceiver类的方法,去AndroidManifest.xml中去注册静态广播

<receiver android:name=".receiver.SMSBroadcastReceiver">
            <intent-filter>
                <action android:name="android.provider.Telephony.SMS_RECEIVED"></action>
            </intent-filter>
        </receiver>


加上权限: <uses-permission android:name="android.permission.RECEIVE_SMS"></uses-permission>


那么现在已经可以运行获取到短信了,如果第一条没有获取到就再发一条试试看是否能再次获得短信,如果不能请对照上面的步骤。


现在拿到短信的内容和发送的手机号,我们就可以通知View刷新了!我的想法就是在接收短信成功的时候再发送一条广播,Activity接收到这条广播之后就可以去通知刷新了。

如果这个广播是静态注册的,那么只能在Activity中写一个静态的内部类,所以一些参数也要改成静态的参数,会非常不方便。所以我们使用动态注册广播。

Intent intent1=new Intent("MyMoveBroadcastReceiver");
context.sendBroadcast(intent1);  写入上面的for循环中,当然我们可以把获取的内容保存到本地。

SharedPreferences preferences=context.getSharedPreferences("mycontext", Context.MODE_PRIVATE);
SharedPreferences.Editor editor=preferences.edit();
editor.putString("phone",SMSAddress.toString());
editor.putString("context",SMSContent.toString());

editor.commit();

这段代码要写在发送广播前面,不然广播发送出去了,本地去还没有保存到值。

我的需求是使用ListView来即时显示,所以我使用的SQLList数据库保存的短信值,为了方便就先把值保存到本地吧。

把上面的代码写入for循环之后就可以回到Activity中了。


Activity中初始化

public class MainActivity extends AppCompatActivity {
    private TextView phonenumber,taketime,contenx;
    private ListView mylv;
    private mybroad receiver = null;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mylv = (ListView) findViewById(R.id.mylv);
      /*  MySqliteOpenHelper helper = new MySqliteOpenHelper(this, MySqliteOpenHelper.SQlite.DB_NAME, null, 1);
        db = helper.getReadableDatabase();*/
        phonenumber = (TextView) findViewById(R.id.phonenumber);
        taketime = (TextView) findViewById(R.id.taketime);
        contenx = (TextView) findViewById(R.id.contenx);
        MoveBroadcastReceiver();

}

 private void MoveBroadcastReceiver(){
        receiver = new mybroad();
        IntentFilter filter = new IntentFilter();
        filter.addAction("MyMoveBroadcastReceiver");
        this.registerReceiver(receiver, filter);
    }

//内部类继承BroadcastReceiver

public class mybroad extends BroadcastReceiver{
        @Override
        public void onReceive(Context context, Intent intent) {
            if (intent.getAction().equals("MyMoveBroadcastReceiver")) {
                updateview();//改变视图的方法。
            }
        }
    }


private void updateview() {
        SharedPreferences preferences=getSharedPreferences("mycontext", Context.MODE_PRIVATE);
        String numeberstr=preferences.getString("phone","");
        String contextstr=preferences.getString("context","");
        String timestr=preferences.getString("time","");
        phonenumber.setText(numeberstr);
        taketime.setText(timestr);
        contenx.setText(contextstr);
    }

    }


好的这个时候就可以接收广播并且通知视图刷新了,因为我的项目中是使用的公司的框架通知的刷新,所以就不把案例放上去了,按照这个步骤是都可以搞好的。

步骤已经很详细了。









猜你喜欢

转载自blog.csdn.net/qq_36275193/article/details/61919099