2013-03-19 45 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; 
} 

很简单。我也知道它可能是Android清理,但Facebook Messenger和其他服务如何不被关闭?除非我不知道它导致它没有吐司消息?或者有没有办法只运行一次创建?

好无论如何,谢谢大家的期待!希望有人能更好地教育我! :)

编辑:新方法想知道这是正确的吗?

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

我知道我还可以注册我的我的应用程序的清单内的接收器,但我希望用户能够控制接收器是否激活。

然后使用PackageManagersetComponentEnabledSetting()启用或禁用BroadcastReceiver是在清单中注册。您无需为了控制“接收器是否处于活动状态”而使用服务浪费用户的RAM。

+0

我编辑了我的问题,是新的编辑方式吗?它似乎在工作。我在我的Manifest中激活它,它似乎是用按钮来完成这项工作。只是想知道我的语法和位置是否正确。我确实将“0”更改为“-1”,看起来更平滑。 – Seth 2013-03-19 18:41:21

+0

@Seth:无论你看到它,你都可以摆脱'getApplicationContext()'。我不知道'finish()'是否有必要,这取决于你想要做什么。 – CommonsWare 2013-03-19 18:57:16

+0

我在按钮上点击'finish()',使用户不必手动按下后退按钮或主页按钮即可离开我的活动。只是试图为用户删除不需要的步骤。由于没有Context参数,所以当我删除'getApplicationContext()'时会出错。这就是eclipse所说的“ComponentName(Context,)”它适用于我包含'getApplicationContext()'时是否还有别的东西我应该使用呢? – Seth 2013-03-19 19:29:06

相关问题