我们知道Service是Android的四大组件之一,可以在后台长期运行。下面的案例是通过Service的应用场景,实现App常驻后台,通过注册自定义的广播监听者,在系统接收到短信信息时,拦截读取短信的发送者和短信内容,并显示出来。

代码实现:

XML文件:

xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:app="http://schemas.android.com/apk/res-auto"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    tools:context=".MainActivity">    android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="Hello World!" />

java文件:

package com.example.myapplication;import androidx.appcompat.app.AppCompatActivity;import android.content.Intent;import android.os.Bundle;public class MainActivity extends AppCompatActivity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        Intent intent = new Intent(MainActivity.this, MessageService.class);        startService(intent);    }}
package com.example.myapplication;import android.app.Service;import android.content.Intent;import android.content.IntentFilter;import android.os.IBinder;import java.security.Provider;public class MessageService extends Service {    private MessageReciever mReceiver;    @Override    public IBinder onBind(Intent arg0) {        return null;    }    @Override    public void onCreate() {        mReceiver = new MessageReciever();        IntentFilter filter = new IntentFilter("android.provider.Telephony.SMS_RECEIVED");        registerReceiver(mReceiver, filter);    }    @Override    public void onDestroy() {        if(null != mReceiver)        {            unregisterReceiver(mReceiver);            mReceiver = null;        }    }    @Override    public int onStartCommand(Intent intent, int flags, int startId) {        return super.onStartCommand(intent, flags, startId);    }    @Override    public boolean onUnbind(Intent intent) {        return super.onUnbind(intent);    }}
package com.example.myapplication;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.os.Bundle;import android.telephony.SmsMessage;import android.telephony.TelephonyManager;import android.widget.Toast;import static android.telephony.TelephonyManager.PHONE_TYPE_CDMA;public class MessageReciever extends BroadcastReceiver {    private static final String SMS_RECEIVER_ACTION = "android.provider.Telephony.SMS_RECEIVED";    @Override    public void onReceive(Context context, Intent intent) {        StringBuilder sBuilder = new StringBuilder();        String format = intent.getStringExtra("format");        if(SMS_RECEIVER_ACTION.equals(intent.getAction()))        {            Bundle bundle = intent.getExtras();            if(null != bundle)            {                Object[] pdus = (Object[])bundle.get("pdus");                assert pdus != null;                SmsMessage[] messages = new SmsMessage[pdus.length];                for(int i = 0; i < messages.length; ++i)                {                    messages[i] = SmsMessage.createFromPdu((byte[])pdus[i],format);                }                for(SmsMessage msg : messages)                {                    sBuilder.append("来自:").append(msg.getDisplayOriginatingAddress()).append("\n").append("短信内容:");                    sBuilder.append(msg.getDisplayMessageBody()).append("\n");                }            }        }        Toast.makeText(context, "吆喝,快看!! 您收到了一条短信!!\n" + sBuilder.toString(), Toast.LENGTH_LONG).show();    }}

运行效果:


我这是用的Android studio自带的 AVD调试的,你可以直接利用模拟器旁边的菜单栏进行发送短信,方法如下图:
1、首先点击这个按钮

2、然后在弹出的界面中进行下图操作

要注意的是:

1、上面的程序写完后要在 manifests 文件中进行短信权限的注册,添加如下代码:

    android:name="android.permission.RECEIVE_SMS"/>     android:name="android.permission.SEND_SMS"/>    android:name="android.permission.READ_SMS"/>    android:name="android.permission.WRITE_SMS" />

2、运行完程序打包完成APP后要打开此应用的短信权限,如下:

3、关于接收短信时候, 在Android Studio中编辑代码提示
createFromPdu(byte[] pdu)这个方法不推荐使用了

然后查得知从API 23以后应该用
createFromPdu(byte[ ], String) 代替,第二个参数应该是短信的类型,GSM与CDMA短信的解码方式不同,所以应该传入这个参数。添加如下代码
String format = intent.getStringExtra(“format”);
来从Intent 中获取format;

参考博文:https://blog.csdn.net/wushuangbuhuan/article/details/50886017

更多相关文章

  1. Android中的消息机制(Handler)
  2. Android消息机制(六) 总结
  3. Android通过WebView实现office文档在线预览无法显示问题解决
  4. Android(安卓)中的依赖注入框架
  5. Android(安卓)Studio Intent使用(显式、隐式) 第一行代码
  6. 运用smali自动注入技术分析android应用程序行为
  7. android连接webapp发送接收消息最简实现
  8. [Android(安卓)实例] 史上最全的Android的Tab与TabHost讲解
  9. 新浪微博布局学习――妙用TabHost

随机推荐

  1. 编译linux内核前用make menuconfig设置时
  2. Linux/Unix下ODBC的安装
  3. 为什么Linux不需要磁盘碎片整理?——借以
  4. 使用Swoole加速Laravel(正式环境中)
  5. 在Mac OS X/Linux上的vscwprintf。
  6. vmware克隆Centos6.4虚拟机网卡无法启动
  7. linux虚拟机空间不足解决
  8. Linux---more命令学习
  9. 拆分gzip压缩日志文件而不将未压缩的拆分
  10. 安装Linux系统的磁盘分区