开发者社区> 问答> 正文

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

最近,小弟在写一个拦截短信的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

展开
收起
爵霸 2016-03-16 08:49:56 2330 0
1 条回答
写回答
取消 提交回答
  • 日志里caused by原因是空指针,程序97行,空指针好解决,断点看看怎么空了

    2019-07-17 19:03:16
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
58同城Android客户端Walle框架演进与实践之路 立即下载
Android组件化实现 立即下载
蚂蚁聚宝Android秒级编译——Freeline 立即下载