我正在尝试开发简单的应用程序(服务),它将在启动时自动启动。主要活动也创建了新服务(我可以在服务任务管理器列表中看到它)。这个服务也应该在重新启动我的手机(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);
}
}
答案 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);
}
}