2013-03-19 2 views
0

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

Вот сервис, который продолжает перезагружать.

public class DockServiceListener extends Service{ 

IntentFilter filter; 
BroadcastReceiver mReceiver; 

public void onCreate() { 
    super.onCreate(); 

    Toast.makeText(getApplicationContext(), "Receiver started!", Toast.LENGTH_SHOR 

    filter = new IntentFilter(Intent.ACTION_DOCK_EVENT); 
    mReceiver = new DockReceiver(); 

} 

public int onStartCommand(Intent intent, int flags, int id) { 
    super.onStartCommand(intent, START_STICKY, id); 

    registerReceiver(mReceiver, filter); 

    return id; 
} 

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

Очень простой. Я также знаю, что это может быть андроид, но как скоро Facebook Messenger и другой сервис не будут закрыты? Разве я просто не знаю, потому что у него нет тоста? Или есть способ только запустить onCreate один раз?

Ну так или иначе, спасибо всем за то, что искали! Надеюсь, кто-то может лучше просветить меня! :)

EDIT: Новый метод, интересно, правильно ли это?

startBtn.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 
      PackageManager pm = getApplicationContext().getPackageManager(); 
      ComponentName dockReceiver = new ComponentName(getApplicationContext(), DockReceiver.class); 
      pm.setComponentEnabledSetting(dockReceiver, PackageManager.COMPONENT_ENABLED_STATE_ENABLED, 0); 
      finish(); 



     } 
    }); 

    stopBtn.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 

      PackageManager pm = getApplicationContext().getPackageManager(); 
      ComponentName dockReceiver = new ComponentName(getApplicationContext(), DockReceiver.class); 
      pm.setComponentEnabledSetting(dockReceiver, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, 0); 
      finish(); 

     } 
    }); 

ответ

1

Я знаю, также я могу зарегистрировать приемник внутри манифеста моего приложения, но я хочу, чтобы пользователь мог контролировать, если приемник активен или нет.

Затем используйте PackageManager и setComponentEnabledSetting(), чтобы включить или отключить BroadcastReceiver, который зарегистрирован в манифесте. Вам не нужно тратить ОЗУ пользователя на обслуживание только для того, чтобы контролировать, активен ли приемник или нет.

+0

Я отредактировал мой вопрос, является ли новое редактирование правильным способом? Кажется, это работает. Я активировал его внутри моего манифеста, и, похоже, он работает с кнопками. Просто интересно, правилен ли мой синтаксис и местоположение. Я изменил «0» на «-1», и он выглядит более плавным. – Seth

+0

@Seth: Вы можете избавиться от 'getApplicationContext()', где бы вы его ни увидели. И я понятия не имею, нужно ли 'finish()' или нет, в зависимости от того, что вы пытаетесь сделать. – CommonsWare

+0

Я нахожу 'finish()' на кнопке, поэтому пользователю не нужно вручную нажимать кнопку «Назад» или кнопку «домой», чтобы оставить свою активность. Просто попробуйте удалить ненужный шаг для пользователя. И это ошибка, когда я удаляю 'getApplicationContext()', поскольку нет аргумента Context. Это то, что eclipse говорит «ComponentName (Context, )», он работает, когда я включаю 'getApplicationContext()' есть ли что-то другое, которое я должен использовать вместо этого? – Seth

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