2012-10-19 111 views
3

我想在启动时启动一个前台服务,但它永远不会启动,但是如果我尝试启动一个正常的后台服务。它开始非常好。前台服务没有在启动时启动

你能让我让我的代码出什么问题吗?

我的代码是: 清单文件:

<application 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" > 
    <receiver android:name="com.test.andsrvfg.AndSrvFgService"> 
     <intent-filter> 
      <action android:name="android.intent.action.BOOT_COMPLETED" /> 
     </intent-filter> 
    </receiver> 
    <service android:name="AndSrvFgService"> 
     <intent-filter> 
      <action android:name="com.test.andsrvfg.AndSrvFgService"></action> 
     </intent-filter> 
    </service> 
</application> 

广播接收器来处理ACTION_BOOT_COMPLETED:

public class AndSrvFgStarter extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) 
    { 
     if (intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)) { 
      Intent i = new Intent(); 
      i.setAction("com.test.andsrvfg.AndSrvFgService"); 
      context.startService(i); 
     } 
    } 
} 

实际的服务是这样的:

public class AndSrvFgService extends Service { 

    private boolean bForeground = false; 
    public AndSrvFgService() { 
    } 

    public IBinder onBind(Intent intent) { 
     return null; 
    } 

    @Override 
    public void onCreate() { 
    } 

    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
     if(!bForeground) { 
      bForeground = true; 
      Notification note = new Notification(0, null, System.currentTimeMillis()); 
      note.flags |= Notification.FLAG_NO_CLEAR; 
      startForeground(1242, note);  
       } 


     return START_STICKY; 
    } 

    @Override 
    public void onDestroy() { 
     if(bForeground) { 
      stopForeground(true); 
     } 
    } 
+0

你在AndroidManifest.xml中有权限吗? – Lucifer

+0

您确定您清单声明了正确的意图过滤器吗?你没有发布,所以我无法验证我的结果,但这似乎是你的问题。 – AedonEtLIRA

+0

你在测试哪个版本? –

回答

3

此代码的工作对我来说:

的android:权限= “android.permission.RECEIVE_BOOT_COMPLETED”

  • 设置启用为true:

    <manifest xmlns:android="http://schemas.android.com/apk/res/android" 
        package="com.dfsdf" 
        android:versionCode="1" 
        android:versionName="1.0" > 
    
        <uses-sdk 
         android:minSdkVersion="8" 
         android:targetSdkVersion="15" /> 
        <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/> 
    
        <application 
         android:icon="@drawable/ic_launcher" 
         android:label="@string/app_name" 
         android:theme="@style/AppTheme" > 
         <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> 
    
         <activity android:name="com.google.ads.AdActivity" 
           android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize"/> 
    
         <service android:name=".MyService"/> 
    
         <receiver android:enabled="true" 
          android:name=".BootUpReceiver" 
          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> 
    
    • 在接收器将这个

      android:enabled =“true”

  • +0

    请给出代码:)请解释您的更改 – shkschneider

    +0

    我发表了一条评论。现在我添加一些额外的行。但它必须工作 – moskis

    +0

    仍然没有工作..我可以在你的代码和我的代码中看到的唯一区别是 - 我没有使用任何活动。所以它只是广播接收机和服务。请注意,如果我在后台启动服务而不是前台启动服务,相同的代码工作正常。 – Androidme