在没有活动的情况下启动服务

hel*_*ene 5 boot service android broadcastreceiver

我想创建一个只包含服务(没有活动)的应用程序.此服务必须在启动时启动.我的问题是,如果没有活动,似乎启动接收器似乎没有呼叫.我测试了以下示例.我有不同的文件:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

  • 测试1(带活动)

    <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>
    
    Run Code Online (Sandbox Code Playgroud)

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

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

MyReceiver onReceive
MyService onStartCommand

  • 测试2(没有活动)

    <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>
    
    Run Code Online (Sandbox Code Playgroud)

    - >服务没有运行

    • 测试3

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


是否有必要为brodcast接收器工作?为什么?

谢谢你的闪电.

PPD*_*PPD 8

从Android 3.1开始,在用户手动启动活动之前,BroadcastReceiver将无法工作,这是为了提供安全性.一旦用户第一次运行应用程序,那么您的BroadcastReceiver将始终运行,除非它没有强制停止它.一旦活动在第一时间启动,您的广播接收器即使在重新启动之后也会运行.

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

  • @JaswinderWadali因为他们有活动因此他们正在运行. (3认同)
  • 好的,谢谢,我了解这个问题。我将必须创建一个活动。 (2认同)