13

我有一个IntentService并且我想让它与持续的通知保持一致。问题是通知出现然后立即消失。该服务继续运行。我应该如何startForeground()使用IntentService

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    super.onStartCommand(intent, flags, startId);
    Notification notification = new Notification(R.drawable.marker, "Notification service is running",
            System.currentTimeMillis());
    Intent notificationIntent = new Intent(this, DashboardActivity.class);
    notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|
        Intent.FLAG_ACTIVITY_SINGLE_TOP);
    PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0);
    notification.setLatestEventInfo(this, "App",
            "Notification service is running", pendingIntent);
    notification.flags|=Notification.FLAG_NO_CLEAR;
    startForeground(1337, notification);
    return START_STICKY;
}

@Override
protected void onHandleIntent(Intent intent) {

    String id = intent.getStringExtra(ID);
    WebSocketConnectConfig config = new WebSocketConnectConfig();
    try {
        config.setUrl(new URI("ws://" + App.NET_ADDRESS
                + "/App/socket?id="+id));
    } catch (URISyntaxException e) {
        e.printStackTrace();
    }
    ws = SimpleSocketFactory.create(config, this);
    ws.open();
}

谢谢

4

2 回答 2

23

这不应该是一个IntentService. 如所写,您的IntentService意志将存活一毫秒左右。一旦onHandleIntent()返回,服务就会被销毁。这应该是一个常规Service的,您可以在其中分叉自己的线程并管理线程和服务的生命周期。

您立即离开的原因Notification是服务将立即离开。

于 2012-03-29T18:47:45.820 回答
6

作为状态的文档IntentService

...该服务根据需要启动,使用工作线程依次处理每个 Intent,并在工作结束时自行停止。

所以,我想问题是,你的服务在onHandleIntent()完成后就无法工作了。因此,服务会自行停止并且通知被忽略。因此,IntentService 的概念可能不是您任务的最佳案例。


由于问题的标题是“IntentService 的 StartForeground”,我想澄清一些事情:

让您的 IntentService 在前台运行非常简单(请参见下面的代码),但您肯定需要考虑几件事:

  • 如果只需要几秒钟,请不要在前台运行服务 - 这可能会困扰您的用户。想象一下您定期运行短任务 - 这将导致通知出现和消失 - uhhhh*

  • 您可能需要使您的服务能够保持设备唤醒(但这是另一回事,stackoverflow 对此进行了很好的介绍)*

  • 如果您将多个 Intent 排队到 IntentService 中,则下面的代码将最终显示/隐藏通知。(因此对于您的情况可能有更好的解决方案 - 正如@CommonsWare 建议扩展 Service 并自己做所有事情,但是想提一下 - javadoc 中没有任何 IntentService 说它只工作几秒钟 - 只要它工作它必须做点什么。)


public class ForegroundService extends IntentService {

    private static final String TAG = "FrgrndSrv";

    public ForegroundService() {
        super(TAG);
    }

    @Override
    protected void onHandleIntent(Intent intent) {

        Notification.Builder builder = new Notification.Builder(getBaseContext())
                .setSmallIcon(R.drawable.ic_foreground_service)
                .setTicker("Your Ticker") // use something from something from R.string
                .setContentTitle("Your content title") // use something from something from
                .setContentText("Your content text") // use something from something from
                .setProgress(0, 0, true); // display indeterminate progress

        startForeground(1, builder.build());
        try {
            doIntesiveWork();
        } finally {
            stopForeground(true);
        }
    }

    protected void doIntesiveWork() {
        // Below should be your logic that takes lots of time
        try {
            Thread.sleep(10000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
于 2016-12-02T08:28:23.467 回答