在没有 activity 的情况下在启动时启动服务

Start Service at boot without activity

我想创建一个只包含服务的应用程序(没有 activity)。此服务必须在引导时启动。 我的问题是,如果没有 activity,引导接收器似乎不会调用。 我用下面的例子进行了测试。 我有不同的文件:

MyReceiver.java :

package com.test.teststartserviceatboot;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
import android.widget.Toast;

public class MyReceiver extends BroadcastReceiver {
    @Override
    public void onReceive( Context ctx, Intent i ) {

        Log.v( "MyReceiver", "onReceive : ");
        Intent intent = new Intent( ctx, MonService.class );
        ctx.startService(intent);
    }
}

MyService.java :

package com.test.teststartserviceatboot;

import android.app.Service;

public class MyService extends Service {
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.v( "MyService","onStartCommand" );
        return super.onStartCommand(intent, flags, startId);
    }
    @Override
    public IBinder onBind( Intent arg0 ) {
        Log.v( "MyService","onBind" );
        return null;
    }
}

MainActivity.java:

package com.test.teststartserviceatboot;

import android.app.Activity;
import android.os.Bundle;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
}

我只在我的几次测试中修改了 AndroidManifest。

-> 重启后,服务是 running.I 查看日志:

AtivityManager Start proc com.test.teststartserviceatboot for broadcast com.test.teststartserviceatboot/.MyReceiver: pid=1808 uid=10156 gids={50156}

MyReceiver onReceive
MyService onStartCommand

我在测试 1 中使用相同的应用程序(activity)。这次我在重启平板电脑之前终止了应用程序(参数->应用程序->TestServiceAtBoot->强制停止)。 -> 重启后,服务不运行


广播接收器是否需要 activity?为什么?

感谢您的照亮。

从 Android 3.1 开始,BroadcastReceiver 在用户手动启动 activity 之前不会工作,这是为了提供安全性。一旦用户 运行 第一次使用该应用程序,您的 BroadcastReceiver 将始终 运行 除了它不会强制停止它。一旦 activity 首次启动,您的广播接收器将 运行 即使在重新启动设备后也是如此。

因此在您的应用程序中您必须有一个 Activity 到 运行 BroadcastReceiver。