2012-09-21 13 views
1

Когда я Force Close приложение, выполняет ли BroadcastReceiver намерение?Android - BroadcastReceiver не работает

У меня есть этот BroadcastReceiver класс:

public class Receiver extends BroadcastReceiver implements Variables { 

    CheckConexion cc; 

    @Override 
    public void onReceive(Context contxt, Intent intent) { 

     // Cuando hay un evento, lo diferenciamos y hacemos una acción. 

     if (intent.getAction().equals(SMS_RECEIVED)) { 
      Sms sms = new Sms(null, contxt); 
      sms.uploadNewSms(intent); 
     } else if (intent.getAction().equals(Intent.ACTION_BATTERY_LOW)) { 
      // st.batterylow(contxt); 
     } else if (intent.getAction().equals(Intent.ACTION_BATTERY_CHANGED)) { 
      /* 
      * try { new PhoneState(contxt).battery(intent.getIntExtra("level", 
      * 0)); } catch (JSONException e) { e.printStackTrace(); } 
      */// Nothing at the moment 
     } else if (intent.getAction().equals(Intent.ACTION_POWER_CONNECTED)) { 
      Log.i("******", "Battery on"); 
     } else if (intent.getAction().equals(Intent.ACTION_POWER_DISCONNECTED)) { 
      // st.power(0, contxt); 
     } else if (intent.getAction().equals(Intent.ACTION_PACKAGE_ADDED) 
       || intent.getAction().equals(Intent.ACTION_PACKAGE_CHANGED) 
       || intent.getAction().equals(Intent.ACTION_PACKAGE_REMOVED)) { 
      Database db = new Database(contxt); 
      if (db.open().Preferences(4)) { 
       Uri data = intent.getData(); 
       new ListApps(contxt).import_app(intent, contxt, data, 
         intent.getAction()); 
      } 
      db.close(); 
     } else if (intent.getAction().equals(
       ConnectivityManager.CONNECTIVITY_ACTION)) { 
      cc = new CheckConexion(contxt); 
      if (cc.isOnline()) { 

       Database db = new Database(contxt); 
       db.open(); 
       if (db.move() == 1) { 
        new UploadOffline(contxt); 
       } 
       db.close(); 

      } 
     } 

    } 

    public void register(Context c) { 
     IntentFilter i = new IntentFilter(); 
     i.addAction(SMS_RECEIVED); 
     i.addAction(Intent.ACTION_BATTERY_LOW); 
     i.addAction(Intent.ACTION_POWER_CONNECTED); 
     i.addAction(Intent.ACTION_POWER_DISCONNECTED); 
     i.addAction(Intent.ACTION_CALL_BUTTON); 
     i.addAction(Intent.ACTION_CAMERA_BUTTON); 
     i.addAction(Intent.ACTION_BATTERY_CHANGED); 
     i.addAction(ConnectivityManager.CONNECTIVITY_ACTION); 
     c.registerReceiver(this, i); 
     IntentFilter apps = new IntentFilter(); 
     apps.addAction(Intent.ACTION_PACKAGE_ADDED); 
     apps.addAction(Intent.ACTION_PACKAGE_CHANGED); 
     apps.addAction(Intent.ACTION_PACKAGE_REMOVED); 
     apps.addDataScheme("package"); 
     c.registerReceiver(this, apps); 
    } 

    public void unregister(Context c) { 
     c.unregisterReceiver(this); 
    } 
} 

я называю регистрации, а затем я Force Close. Я хочу, чтобы BroadcastRecever работал и слушал входящие намерения.

Спасибо.

ответ

2

Приемники широковещательной передачи не будут работать после принудительного закрытия вашего приложения. Это встроено в ОС по дизайну.

+0

Могу ли я осуществить сервис? –

+0

Это неправда. Если вы зарегистрируете приемник с registerReceiver(), его срок службы привязан к времени жизни объекта, зарегистрированного им. Поэтому, если вы убьете приложение, приемник больше не будет работать. Служба не будет работать. Вы должны зарегистрировать получателя в манифесте вашего приложения, чтобы заставить его работать, как вы описываете. –

+1

Тобиас, это не так, как в версии API версии 12. См. Http://developer.android.com/about/versions/android-3.1.html, раздел «Запуск элементов управления в остановленных приложениях». BroadcastReceivers не будет работать, если приложение будет остановлено, даже если оно объявлено в манифесте. – WindyB

0

Зарегистрируйте ваш ресивер в своем manifest. Затем он будет постоянно активирован (вы можете вручную включить/отключить его, если вам нравится использовать диспетчер пакетов).

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