gpt4 book ai didi

android - 在没有 Activity 的情况下在启动时启动服务

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:20:38 26 4
gpt4 key购买 nike

我想创建一个仅包含服务(无 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);
}
}

我的服务.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;
}
}

主要 Activity .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(有 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 Start proc com.test.teststartserviceatboot for broadcast com.test.teststartserviceatboot/.MyReceiver: pid=1808 uid=10156 gids={50156}

MyReceiver onReceive
MyService onStartCommand

  • 测试 2(无 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>

    ->服务没有运行

    • 测试 3

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


是否有必要为广播接收器工作开展 Activity ?为什么?

谢谢你的点亮。

最佳答案

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

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

关于android - 在没有 Activity 的情况下在启动时启动服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27856728/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com