开机启动服务而不需要活动

6
我希望创建一个只包含服务(没有活动)的应用程序。这个服务必须在启动时启动。我的问题是,如果没有活动,似乎启动接收器不会被调用。我使用以下示例进行测试。我有不同的文件:

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。

  • Test 1 (with Activity)

    <uses-sdk android:minSdkVersion="17" 
            android:targetSdkVersion="17"/>
    
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
    
    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" >
    
        <activity
            android:name=".MainActivity"
            android:label="@string/title_activity_main" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
    
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <service
            android:name=".MyService"
            android:exported="false"
            android:label="MyService" >
        </service>
    
        <receiver android:name=".MyReceiver" >
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED" />
            </intent-filter>
        </receiver>
    </application>
    

-> 重启后,该服务正在运行。我看到日志:

AtivityManager 为 com.test.teststartserviceatboot 启动进程以进行广播 com.test.teststartserviceatboot/.MyReceiver: pid=1808 uid=10156 gids={50156}

MyReceiver onReceive
MyService onStartCommand

  • Test 2 (without Activity)

    <uses-sdk android:minSdkVersion="17" 
            android:targetSdkVersion="17"/>
    
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
    
    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" >
        <service
            android:name=".MyService"
            android:exported="false"
            android:label="MyService" >
        </service>
    
        <receiver android:name=".MyReceiver" >
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED" />
            </intent-filter>
        </receiver>
    </application>
    

    ->The service don't running

    • Test 3

我在测试1上使用同一个应用程序(带有活动)。这次在重新启动平板电脑之前杀死了应用程序(参数->应用程序->TestServiceAtBoot->强制停止)。 -> 重启后,服务不运行


广播接收器是否需要活动才能工作?为什么?

谢谢您的解答。


我不这么认为。因为在manifest.xml中不注册Activity也可以完美运行。 - M D
@MD 他说当一个活动没有在清单文件中注册时,它是不起作用的。 - Leo
@helene 将此活动设置为完全透明如何? - Leo
@Leo 请仔细阅读我的评论。 - M D
你需要阅读https://dev59.com/T2oy5IYBdhLWcg3wdt4L。 - Pankaj Kumar
显示剩余2条评论
1个回答

8

从Android 3.1开始,BroadcastReceiver需要等到用户手动启动一个活动才能工作,这是为了提供安全性。一旦用户第一次运行应用程序,那么您的广播接收器将始终运行,除非它没有被强制停止。一旦活动在第一次启动时启动,即使重新启动您的设备,广播接收器也将运行。

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


但是 WhatsApp Gmail 等应用正在运行,请检查您的设备是否为 3.1 及以上版本。 - wadali
3
@JaswinderWadali因为他们有活动,所以他们在运行。 - PPD
2
好的,谢谢,我明白问题了。我需要创建一个活动。 - helene
1
但是如果您没有Activity,应用程序仅由后台服务组成怎么办?是否无法接收启动广播接收器? - ralphgabb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接