在Android中启动服务


115

当某个活动开始时,我想致电服务。因此,这是Service类:

public class UpdaterServiceManager extends Service {

    private final int UPDATE_INTERVAL = 60 * 1000;
    private Timer timer = new Timer();
    private static final int NOTIFICATION_EX = 1;
    private NotificationManager notificationManager;

    public UpdaterServiceManager() {}

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

    @Override
    public void onCreate() {
        // Code to execute when the service is first created
    }

    @Override
    public void onDestroy() {
        if (timer != null) {
            timer.cancel();
        }
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startid) {
        notificationManager = (NotificationManager) 
                getSystemService(Context.NOTIFICATION_SERVICE);
        int icon = android.R.drawable.stat_notify_sync;
        CharSequence tickerText = "Hello";
        long when = System.currentTimeMillis();
        Notification notification = new Notification(icon, tickerText, when);
        Context context = getApplicationContext();
        CharSequence contentTitle = "My notification";
        CharSequence contentText = "Hello World!";
        Intent notificationIntent = new Intent(this, Main.class);
        PendingIntent contentIntent = PendingIntent.getActivity(this, 0,
                notificationIntent, 0);
        notification.setLatestEventInfo(context, contentTitle, contentText,
                contentIntent);
        notificationManager.notify(NOTIFICATION_EX, notification);
        Toast.makeText(this, "Started!", Toast.LENGTH_LONG);
        timer.scheduleAtFixedRate(new TimerTask() {

            @Override
            public void run() {
                // Check if there are updates here and notify if true
            }
        }, 0, UPDATE_INTERVAL);
        return START_STICKY;
    }

    private void stopService() {
        if (timer != null) timer.cancel();
    }
}

这就是我所说的:

Intent serviceIntent = new Intent();
serviceIntent.setAction("cidadaos.cidade.data.UpdaterServiceManager");
startService(serviceIntent);

问题是什么也没发生。上面的代码块在活动的结尾被调用onCreate。我已经调试了,没有异常被抛出。

任何想法?


1
小心使用计时器-AFAIK,当您的服务关闭以释放资源时,重新启动服务时不会重新启动该计时器。没错,START_STICKY将重新启动服务,但是仅调用onCreate,并且不会重新初始化计时器var。您可以使用START_REDELIVER_INTENT,警报服务或API 21 Job Scheduler来解决此问题。
Georg

万一您忘记了,请确保已使用<service android:name="your.package.name.here.ServiceClass" />application标签在android清单中注册了该服务。
Japheth Ongeri-inkalimeva '16

Answers:


278

清单中可能没有该服务,或者该服务没有<intent-filter>与您的操作匹配的服务。检查LogCat(通过adb logcat,DDMS或Eclipse中的DDMS透视图)应该会出现一些可能有用的警告。

您更有可能通过以下方式启动服务:

startService(new Intent(this, UpdaterServiceManager.class));

1
如何调试?从来不叫我的服务,我debugg没有显示什么
国内配送

在各处添加一堆Log.e标签:在启动服务之前,服务意图的结果将在服务类别内移动(onCreate,onDestroy,任何和所有方法)。
Zoe

它适用于android sdk 26+上的我的应用程序,但不适用于android sdk 25或更低版本。有什么解决办法吗?
Mahidul Islam

@MahidulIslam:我建议您提出一个单独的堆栈溢出问题,在这里您可以提供一个最小的可重现示例,以更详细地说明您的问题和症状。
CommonsWare

@CommonsWare我已经问了一个问题,这就是: - stackoverflow.com/questions/49232627/...
Mahidul伊斯兰教

81
startService(new Intent(this, MyService.class));

仅仅写这行对我来说还不够。服务仍然无法正常工作。只有在清单上注册服务后,一切都有效

<application
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name" >

    ...

    <service
        android:name=".MyService"
        android:label="My Service" >
    </service>
</application>

1
在Android coderzpassion.com/implement-service-android中学习有关服务的所有内容的最佳示例,对于抱歉迟到
Jagjit Singh,

55

用于启动 服务的 Java代码

活动启动服务:

startService(new Intent(MyActivity.this, MyService.class));

Fragment启动服务:

getActivity().startService(new Intent(getActivity(), MyService.class));

MyService.java

import android.app.Service;
import android.content.Intent;
import android.os.Handler;
import android.os.IBinder;
import android.util.Log;

public class MyService extends Service {

    private static String TAG = "MyService";
    private Handler handler;
    private Runnable runnable;
    private final int runTime = 5000;

    @Override
    public void onCreate() {
        super.onCreate();
        Log.i(TAG, "onCreate");

        handler = new Handler();
        runnable = new Runnable() {
            @Override
            public void run() {

                handler.postDelayed(runnable, runTime);
            }
        };
        handler.post(runnable);
    }

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public void onDestroy() {
        if (handler != null) {
            handler.removeCallbacks(runnable);
        }
        super.onDestroy();
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        return START_STICKY;
    }

    @SuppressWarnings("deprecation")
    @Override
    public void onStart(Intent intent, int startId) {
        super.onStart(intent, startId);
        Log.i(TAG, "onStart");
    }

}

将此服务定义到项目的清单文件中:

清单文件中添加以下标签:

<service android:enabled="true" android:name="com.my.packagename.MyService" />

完成了


7
当我将活动和服务放在同一个程序包中时,它可以提高多少性能?从来没有听说过。
OneWorld 2014年

也许它们是在非常模糊的意义上表示性能,而不是关于运行速度?
Anubian Noob 2015年

3

我喜欢使其更具活力

Class<?> serviceMonitor = MyService.class; 


private void startMyService() { context.startService(new Intent(context, serviceMonitor)); }
private void stopMyService()  { context.stopService(new Intent(context, serviceMonitor));  }

不要忘记清单

<service android:enabled="true" android:name=".MyService.class" />

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.