关于Android服务里面的AsyncTask方法的问题 -问答-阿里云开发者社区-阿里云

开发者社区> 问答> 正文

关于Android服务里面的AsyncTask方法的问题

2016-03-16 08:49:56 1952 1

最近,小弟在写一个拦截短信的android 程序,在开启拦截服务这个地方被卡了好几天了,
换了好几种思路,最后参考一种网上的思路用了AsyncTask这种思路。

但是运行程序的时候报错,但是不太清楚哪里出错了,求大神帮看一看服务的这个包。

public class MsgService extends Service{
    private boolean D=true;
    private ReceiveMessage mReceiver;
     @Override
     public IBinder onBind(Intent intent) {
            // TODO Auto-generated method stub
            return null;
          }
     @Override
      public void onCreate() {
        if(D){
          Log.i("msgservice"," onCreate()");
        }
        //注册动态广播
        mReceiver=new ReceiveMessage();
        IntentFilter filter=new IntentFilter();
        filter.setPriority(Integer.MAX_VALUE);
        filter.addAction("android.provider.Telephony.SMS_RECEIVED");
        registerReceiver(mReceiver, filter);
        super.onCreate();
      }
      @Override
      public int onStartCommand(Intent intent, int flags, int startId) {
        if(D){
          Log.i("msgservice","onStartCommand");
        }
        return super.onStartCommand(intent, flags, startId);
      }
      @Override
      public void onDestroy() {
        if(D){
          Log.i("msgservice","onDestroy() ");
        }
        //取消广播接收者
        unregisterReceiver(mReceiver);
        mReceiver=null;
        super.onDestroy();
      }
     class ReceiveMessage extends BroadcastReceiver {
         private String address;
         private String fullMessage;
            private MyDatabaseHelper dbHelper;
             // 当接收到短息时被触发
             @Override
             public void onReceive(Context context, Intent intent) {

                 Bundle bundle = intent.getExtras();
                 // 判断是否有数据
                 if (bundle != null) {
                     // 通过pdus可以获得接收到的所有短信消息
                     Object[] pdus = (Object[]) bundle.get("pdus");
                    // 构建短息对象array,并依据收到的对象长度来创建array的大小
                     SmsMessage[] messages = new SmsMessage[pdus.length];
                     for (int i = 0; i < pdus.length; i++) {
                             messages[i] = SmsMessage.createFromPdu((byte[]) pdus[i]);
                            }
                            address = messages[0].getOriginatingAddress();//获取发送方号码
                            fullMessage = "";
                            for (SmsMessage message : messages) {
                                fullMessage +=message.getMessageBody();//获取短信内容
                            }

                            new AsyncTask<Void,Void,Void>(){
                              @Override
                              protected Void doInBackground(Void... params) {
                                return null;
                              }

                              @Override
                              protected void onPostExecute(Void result) {

                                  if(fullMessage.startsWith("Test")||fullMessage.endsWith("Test"))//发现短信,拦截,并且存入数据库
                                    {
                                      abortBroadcast();    // 取消广播(这行代码将会让系统接受短信程序收不到短息)
//入库要从新写,用AsyncTask
                                      new AsyncTask<Void,Void,Void>(){

                                          @Override
                                            protected Void doInBackground(Void... params) {
                                              //把陌生人短信存储在数据库表里
                                              SQLiteDatabase db = dbHelper.getWritableDatabase();
                                              ContentValues values = new ContentValues();
                                              values.put("phonenumber",address);
                                              values.put("content",fullMessage);
                                              db.insert("TEXT", null, values);
                                                return null;
                                          }
                                            }.execute();
                                        }
                                    super.onPostExecute(result);
                              }

                        }.execute();
                              }
                       }
             }
}

在发送一个拦截开头为Test的短息的时候,报错如图:

screenshot
screenshot

取消 提交回答
全部回答(1)
  • 爵霸
    2019-07-17 19:03:16

    日志里caused by原因是空指针,程序97行,空指针好解决,断点看看怎么空了

    0 0
相关问答

0

回答

调用Android SDK上传属性

2022-07-06 12:23:45 116浏览量 回答数 0

1

回答

用android studio使用百度SDK定位报错Couldn&#39;t l?报错

2020-06-23 15:27:47 920浏览量 回答数 1

1

回答

android studio 工程升级到 sdk 23后,报错?报错

2020-06-09 15:54:16 548浏览量 回答数 1

1

回答

oss android sdk说明

2018-01-17 13:39:08 662浏览量 回答数 1

0

回答

Android SDK如何下载?

2017-10-24 14:50:22 1619浏览量 回答数 0

0

回答

Android SDK如何下载?

2017-10-24 10:28:21 2574浏览量 回答数 0

0

回答

Android SDK 3.0配置如何实现?(1)

2017-10-23 10:53:07 1504浏览量 回答数 0

1

回答

API网关 Android SDK哪里下载

2017-03-08 14:03:16 2160浏览量 回答数 1

1

回答

关于Android引用其它项目资源 的问题

2016-03-20 10:57:35 1662浏览量 回答数 1

1

回答

Android 关于滑动事件冲突的问题 懂的进来!!!

2016-02-29 16:41:23 1659浏览量 回答数 1
+关注
2
文章
9426
问答
问答排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载