2015-07-20 239 views
1

我已阅读关于此问题的几个答案,但发布的解决方案对我无效。在我的代码中可能有错或错过了。 我需要我的应用程序没有任何活动,在启动完成后自动启动。 如果我包括一个活动,只是为了第一次启动应用程序(退出停止状态),一切正常。 非常感谢您的帮助。android;启动后服务自动启动:FLAG_INCLUDE_STOPPED_PACKAGES不起作用

这是我的代码。

的AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="zag.salva" > 

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> 
<uses-permission android:name="android.permission.READ_CALL_LOG" /> 
<uses-permission android:name="android.permission.READ_PHONE_STATE" /> 
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> 

<application 
    android:allowBackup="true" 
    android:icon="@mipmap/ic_launcher" 
    android:label="@string/app_name" 
    android:theme="@style/AppTheme" > 
    <receiver 
     android:name=".Salva_autostart" 
     android:enabled="true" 
     android:permission="android.permission.RECEIVE_BOOT_COMPLETED" > 
     <intent-filter> 
      <action android:name="android.intent.action.BOOT_COMPLETED" /> 
     </intent-filter> 
    </receiver> 

    <service 
     android:name=".Salva_servizio" 
     android:enabled="true" > 
     <intent-filter> 
      <action android:name=".Salva_servizio" /> 
     </intent-filter> 
    </service> 

</application> 

Salva_autostart.java

public class Salva_autostart extends BroadcastReceiver 
{ 

    @Override 
    public void onReceive(Context context, Intent intent) 
    { 
     Intent intento = new Intent(context, Salva_servizio.class); 
     intento.setFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES); 
     context.startService(intento); 
    } 


} 

Salva_servizio.java

public class Salva_servizio extends Service 
{ 
    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) 
    { 
     // Task execution 
     Salva_invio2 invio = new Salva_invio2(); 
     invio.esegui(this); 
     return Service.START_NOT_STICKY; 
    } 

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

回答

0

注意,由于Android 3.0的用户需要在应用程序可以接收android.intent.action.BOOT_COMPLETED事件之前至少启动一次应用程序。

+0

但这将是默认行为;这就是为什么我介绍setFlags()语句;这不是这样吗?谢谢 – MarioZ

+1

应用程序在首次安装但尚未启动时以及用户手动停止时(在“管理应用程序”中)处于停止状态。默认情况下,系统将FLAG_EXCLUDE_STOPPED_PACKAGES添加到所有广播意图,并且您的BroadcastReceiver正在侦听系统广播。所以基本上你的Salva_autostart不会得到任何意图,如果用户不启动你的应用程序。如果它没有得到任何意图,它也不能启动服务。 –

+0

你还在想什么?我的回答是对的?如果是这样,请评价或投票。 –

4

您不应该将FLAG_INCLUDE_STOPPED_PACKAGES添加到您的接收方意图开始您的服务。您必须将其添加到您用于sendBroadcast的意图。意思是说,您需要将其添加到调用广播的应用程序中。 这就是为什么这个标志在你的代码中是不相关的。

如果您将sendBroadcast从接收器(“Salva_autostart”)仅一次,从您的应用程序之外 - 那么您的应用程序将不再处于“强制停止”状态,并且在下次启动时,您的接收器将被触发。

此外,您应该添加(addFlags)而不是设置(setFlags)。

intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES); 

这是你应该如何从其他应用程序触发接收器:

Intent intent = new Intent("com.xxx.my_filter_intent"); 
    intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES); 
    this.sendBroadcast(intent); 

在您的清单上面的过滤器意图添加到您的接收器(您可以在新的<intent-filter>或在同一添加它是你已经为BOOT_COMPLETED行动

<receiver 
    android:name=".Salva_autostart" 
    android:enabled="true" 
    android:permission="android.permission.RECEIVE_BOOT_COMPLETED" > 

    <intent-filter> 
     <action android:name="android.intent.action.BOOT_COMPLETED" /> 
    </intent-filter> 
    <intent-filter> 
     <action android:name="com.xxx.my_filter_intent" /> 
    </intent-filter> 
</receiver> 

在这里阅读更多: http://developer.android.com/about/versions/android-3.1.html#launchcontrols

+0

即使强制关闭应用程序设置后,它是否会让我的服务在后台运行? – himCream

+0

嗨HimCream,强制停止后,它不会让服务继续运行,广播中的这个标志只会在广播再次发送时触发您的接收器(即使您的应用程序正在强制停止)。 然后,如果您的接收器启动服务 - 您的服务将再次启动。 –