2014-11-09 4 views
-1

Я разработал приложение для получения текстового сообщения (смс) и, следовательно, я внедрил широковещательный приемник в фоновом режиме. Все работает отлично, за исключением того, что я не могу открыть приложение (любой класс активности) из фоновой службы. Я написал код, чтобы начать работу, но это не работает.Открытие приложения из фоновой службы

Я прошел множество подобных вопросов, но не смог найти решение этой проблемы.

Это фрагмент кода класса обслуживания:

public class Background extends Service { 

    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
     // TODO Auto-generated method stub 
     new BroadcastReceiver() { 
      String Number, Body; 

      @Override 
      public void onReceive(Context context, Intent intent) { 
       // TODO Auto-generated method stub 

       Bundle bundle = intent.getExtras(); 

       Object[] messages = (Object[]) bundle.get("pdus"); 
       SmsMessage[] sms = new SmsMessage[messages.length]; 
       for (int n = 0; n < messages.length; n++) { 
        sms[n] = SmsMessage.createFromPdu((byte[]) messages[n]); 
       } 
       for (SmsMessage msg : sms) { 
        Body = new StringBuilder().append(msg.getMessageBody()) 
          .toString(); 
        Number = new StringBuilder().append(
          msg.getDisplayOriginatingAddress()).toString(); 

       } 
       Calendar c = Calendar.getInstance(); 
       // "5/11/2014 03:02:10" 
       String date = c.get(Calendar.DAY_OF_MONTH) + "/" 
         + c.get(Calendar.MONTH) + "/" + c.get(Calendar.YEAR) 
         + " " + c.get(Calendar.HOUR) + ":" 
         + c.get(Calendar.MINUTE) + "" + c.get(Calendar.SECOND); 
       MessageData db = new MessageData(getApplicationContext()); 
       try { 

        db.open(); 
        db.createEntry(Number, Body, date, 0); 
        db.close(); 
       } catch (Exception e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
       Intent intent2 = new Intent(Background.this, CallingTimer.class); 
       intent2.setFlags(Intent.FLAG_FROM_BACKGROUND); 
       intent2.setFlags(Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT); 
       intent2.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
       intent2.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
       startActivity(intent); 
      } 

     }; 

     return Service.START_STICKY; 
    } 

    @Override 
    public IBinder onBind(Intent intent) { 
     // TODO Auto-generated method stub 
     return null; 
    } 

} 

ответ

1

Все работает отлично

Нет, это не так.

Вы создали экземпляр анонимного внутреннего класса, который наследует от BroadcastReceiver ... и после этого вы ничего не сделали с ним. Экземпляр - это локальная переменная вашего метода onStartCommand(), и этот экземпляр выйдет за пределы области и будет собрано в мусор вскоре после того, как возвращается onStartCommand().

Чтобы это исправить:

  1. Move, который BroadcastReceiver на обычный автономный public класса Java.

  2. Добавить элемент <receiver> в манифест, указывающий на него, с соответствующим <intent-filter>, чтобы получать любые трансляции, которые вы считаете нужными.

  3. Добавить <activity>, если у вас его еще нет, чтобы ваш приемник начал работать после того, как пользователь запустил это мероприятие.

  4. Удалить услугу.

  5. Не пишите еще раз, пока не узнаете , почему вы используете услугу.

Смежные вопросы