在Android应用程序中自动启动服务

时间:2011-09-07 14:28:36

标签: android android-manifest android-service

我正在尝试开发简单的应用程序(服务),它将在启动时自动启动。主要活动也创建了新服务(我可以在服务任务管理器列表中看到它)。这个服务也应该在重新启动我的手机(Samsung Galaxy Ace with android 2.3.4)后创建而不启动应用程序,但它不是 - 我在服务任务管理器列表中看不到它。哪里可以有问题?这是我的代码:

的AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="cz.nafik.testService"
      android:versionCode="1"
      android:versionName="1.0">
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
    <uses-sdk android:minSdkVersion="10" />

    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <activity android:name=".TestServiceActivity"
                  android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <service android:name=".MyService"
                 android:icon="@drawable/ic_launcher"
                 android:label="ledNotifier"
                 android:enabled="true">
            <intent-filter>
                <action android:name="cz.nafik.testService.MyService" />
            </intent-filter>
        </service>
        <receiver android:name=".BootUpReceiver" 
                  android:enabled="true"
                  android:permission="android.permission.RECEIVE_BOOT_COMPLETED">
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </receiver>     
    </application>
</manifest>

MyService.java

package cz.nafik.testService;

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.widget.Toast;

public class MyService extends Service {

    @Override
    public IBinder onBind(Intent intent) {
        Toast.makeText(this, "service bind", Toast.LENGTH_LONG).show();
        return null;
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Toast.makeText(this, "service starting", Toast.LENGTH_LONG).show();
        return super.onStartCommand(intent,flags,startId);
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        Toast.makeText(this, "service destroyed", Toast.LENGTH_LONG).show();
    }

}

BootUpReceiver.java

package cz.nafik.testService;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;

public class BootUpReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {

        intent.setAction("cz.nafik.testService.MyService");
        context.startService(intent);

    }

}

TestServiceActivity.java

package cz.nafik.testService;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;

public class TestServiceActivity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        Intent serviceIntent = new Intent();
        serviceIntent.setAction("cz.nafik.testService.MyService");
        this.startService(serviceIntent);

    }
}

4 个答案:

答案 0 :(得分:2)

您已将清单文件中的接收者和权限混淆了。

  • 您应该在文件的开头删除此行:

    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
    
  • 您应该将接收器更改为这个更简单的版本:

    <receiver android:name=".BootUpReceiver">
        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED" />
        </intent-filter>
    </receiver>     
    

这种方式应该有效,除非上面解释的问题存在另一个问题。

答案 1 :(得分:0)

前几天我问过几乎同样的问题。您可以在此处找到它:Android autostart application

只需按照示例代码即可使其正常运行。你用BroadcastReceiver和权限搞砸了一些东西。

答案 2 :(得分:0)

尝试删除:

android:permission="android.permission.RECEIVE_BOOT_COMPLETED"

也许

<category android:name="android.intent.category.DEFAULT" />

来自BootUpReceiver的清单声明。

我没有找到在我自己的应用程序中做同样的事情。

此外,我不知道在您的BOOT_COMPLETED代码中重复使用BootupReceiver意图会产生什么影响。只需创建一个新的,例如:

public class BootUpReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Intent si = new Intent();
        si.setAction("cz.nafik.testService.MyService");
        context.startService(si);
    }

}

答案 3 :(得分:0)

我认为问题在于你用来启动服务的意图:

    intent.setAction("cz.nafik.testService.MyService");
    context.startService(intent);

这不会启动服务cz.nafik.testService.MyService,而是在意图的先前收件人上调用“cz.nafix ...”操作。您可能希望将服务的类明确设置为新intent的接收者,并使该操作特定于该服务。

不是试图重复使用您作为广播一部分收到的意图,而是创建一个新意图并使用它:

Intent startMyService = new Intent( context, MyService.class );
startMyService.setAction( "MAKE_TOAST" );
context.startService( startMyService );

然后在服务中,您可以检查要执行的操作:

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    if( "MAKE_TOAST".equals( intent.getAction() ) )
    {
        Toast.makeText(this, "service starting", Toast.LENGTH_LONG).show();
        return super.onStartCommand(intent,flags,startId);
    }
}