【问题标题】:Start Service at boot without activity在没有活动的情况下启动服务
【发布时间】:2015-03-07 13:08:41
【问题描述】:

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

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。

  • 测试 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>
    

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

AtivityManager 启动 proc com.test.teststartserviceatboot 用于广播 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>
    

    ->服务没有运行

    • 测试 3

我在测试 1 中使用相同的应用程序(带有活动)。这次我在重启平板电脑之前杀死了应用程序(Parameter->Apps->TestServiceAtBoot->force stop)。 -> 重启后,服务不运行


是否有必要为广播接收器工作进行活动?为什么?

感谢您的帮助。

【问题讨论】:

  • 我不这么认为。因为它无需在 manifest.xml 中注册 Activity 即可完美运行
  • @MD 他说当活动没有在清单文件中注册时它不起作用
  • @helene 让活动完全透明怎么样?
  • @Leo 请仔细阅读我的评论。

标签: android service broadcastreceiver boot


【解决方案1】:

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

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

【讨论】:

  • 但是whatsapp gmail之类的应用程序正在运行检查你是否有3.1以上的设备
  • @JaswinderWadali 因为他们有活动所以他们正在跑步。
  • 好的,谢谢,我明白了这个问题。我将不得不创建一个活动。
  • 但是如果您没有 Activity 并且应用程序仅包含后台服务怎么办?是不是无法接收开机广播接收器?
猜你喜欢
  • 2016-06-27
  • 2015-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多