2011-09-07 124 views
0

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

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); 

    } 
} 

回答

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>  
    

这它应该工作的方式,除非在上述解释之外还有另一个问题。

0

几天前我问过几乎相同的问题。你可以在这里找到它:Android autostart application

只需按照示例代码来使它工作。你用BroadcastReceiver和权限搞砸了一些东西。

+0

我的手机已经扎根,OS可以自动安装新的应用程序到SD卡。这是我的问题,所以我必须将android:installLocation =“internalOnly”放入AndroidManifest.xml的清单标签中。感谢您的建议。 –

0

尝试删除:

android:permission="android.permission.RECEIVE_BOOT_COMPLETED" 

,也许还

<category android:name="android.intent.category.DEFAULT" /> 
从舱单申报

BootUpReceiver

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

此外,我不知道在您的BootupReceiver代码中重新使用BOOT_COMPLETED意图的效果。只要创建一个新的,如:

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); 
    } 

} 
0

我认为这个问题是您用于启动该服务的意图:

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

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

而不是试图重用你已经收到广播的一部分的意图,创建一个新的意图和使用,而不是:

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); 
    } 
}