在没有 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。
测试 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>
-> 重启后,服务是 running.I 查看日志:
AtivityManager Start 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>
->服务没有运行
- 测试 3
我在测试 1 中使用相同的应用程序(activity)。这次我在重启平板电脑之前终止了应用程序(参数->应用程序->TestServiceAtBoot->强制停止)。
-> 重启后,服务不运行
广播接收器是否需要 activity?为什么?
感谢您的照亮。
从 Android 3.1 开始,BroadcastReceiver 在用户手动启动 activity 之前不会工作,这是为了提供安全性。一旦用户 运行 第一次使用该应用程序,您的 BroadcastReceiver 将始终 运行 除了它不会强制停止它。一旦 activity 首次启动,您的广播接收器将 运行 即使在重新启动设备后也是如此。
因此在您的应用程序中您必须有一个 Activity 到 运行 BroadcastReceiver。
我想创建一个只包含服务的应用程序(没有 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。
测试 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>
-> 重启后,服务是 running.I 查看日志:
AtivityManager Start 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>
->服务没有运行
- 测试 3
我在测试 1 中使用相同的应用程序(activity)。这次我在重启平板电脑之前终止了应用程序(参数->应用程序->TestServiceAtBoot->强制停止)。 -> 重启后,服务不运行
广播接收器是否需要 activity?为什么?
感谢您的照亮。
从 Android 3.1 开始,BroadcastReceiver 在用户手动启动 activity 之前不会工作,这是为了提供安全性。一旦用户 运行 第一次使用该应用程序,您的 BroadcastReceiver 将始终 运行 除了它不会强制停止它。一旦 activity 首次启动,您的广播接收器将 运行 即使在重新启动设备后也是如此。
因此在您的应用程序中您必须有一个 Activity 到 运行 BroadcastReceiver。