2013-10-03 131 views
0

只有当用户按下刷新按钮时,我的服务才会在系统启动时启动。我试过在堆栈中搜索everythng,但没有我重新编写我的代码4次,没有什么,我希望我的服务在一段时间内运行,当按下刷新按钮时,我不明白为什么不在启动时运行,我错过了什么?启动时的Android启动服务,无法接收广播

的Manifest.xml

<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
package="com.android.moody" 
android:installLocation="internalOnly" 
android:versionCode="0" 
android:versionName="0.6.7.2 alpha" > 

<permission 
    android:name="com.android.moody.permission.GET_SERVER_DATA" 
    android:protectionLevel="normal" /> 

<uses-sdk 
    android:maxSdkVersion="18" 
    android:minSdkVersion="14" 
    android:targetSdkVersion="17" /> 

<uses-permission android:name="com.android.moody.permission.GET_SERVER_DATA" /> 
<uses-permission android:name="android.permission.INTERNET" /> 
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
<uses-permission android:name="android.permission.WAKE_LOCK" /> 
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> 

<application 
    android:allowBackup="true" 
    android:allowClearUserData="true" 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" 
    android:theme="@style/AppTheme" > 
    <activity 
     android:name="activities.MainActivity" 
     android:label="@string/app_name" > 
    </activity> 
    <activity 
     android:name="activities.Menu_esq" 
     android:label="@string/title_activity_menu_esq" > 
    </activity> 
    <activity 
     android:name="activities.BaseActivity" 
     android:label="@string/title_activity_base" > 
    </activity> 
    <activity 
     android:name="activities.MainView" 
     android:label="@string/title_activity_main_view" > 
    </activity> 
    <activity 
     android:name="activities.LoginActivity" 
     android:label="@string/app_name" 
     android:noHistory="true" 
     android:windowSoftInputMode="adjustResize|stateVisible" > 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 

      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 
    <activity 
     android:name="com.example.moody.LeftActivity" 
     android:label="@string/title_activity_left" > 
    </activity> 
    <activity 
     android:name="com.example.moody.RightActivity" 
     android:label="@string/title_activity_right" > 
    </activity> 
    <activity 
     android:name="activities.UserDetailsActivity" 
     android:label="@string/title_activity_user_details" > 
    </activity> 
    <activity 
     android:name="fragments.FragTopicsPreview" 
     android:label="@string/title_activity_copy_of_topics_preview" > 
    </activity> 
    <activity android:name="activities.LoadingActivity" > 
    </activity> 

    <service 
     android:name="service.ServiceBackground" 
     android:enabled="true" 
     android:icon="@drawable/ic_launcher" 
     android:label="@string/moody_service" > 
    </service> 

    <receiver android:name="service.Alarm" > 
     <intent-filter> 
      <action android:name="android.intent.action.BOOT_COMPLETED" /> 
     </intent-filter> 
    </receiver> 
    <receiver 
     android:name="service.StartServiceReceiver" 
     android:permission="com.android.moody.permission.GET_SERVER_DATA" > 
     <intent-filter> 
      <action android:name="moody_get_data" /> 
     </intent-filter> 
    </receiver> 
</application> 

ServiceBackground

public class ServiceBackground extends Service { 
Alarm alarm = new Alarm(); 

public ServiceBackground() { 
    // TODO Auto-generated constructor stub 
} 

private boolean isRunning = false; 
Object getContent; 

@Override 
public IBinder onBind(Intent intent) { 
    // TODO Auto-generated method stub 

    return null; 
} 

@Override 
public void onCreate() { 
    super.onCreate(); 
    // android.os.Debug.waitForDebugger(); 
} 

@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 
    super.onStartCommand(intent, flags, startId); 
    // Starts the alarm 
    alarm.setAlarm(getApplicationContext()); 

    // Announcement about starting 
    Log.d("service", "Service Started"); 

    // Start a Background thread 
    isRunning = true; 
    Thread backgroundThread = new Thread(new BackgroundThread()); 
    backgroundThread.start(); 

    return START_NOT_STICKY; 
} 

@Override 
public void onDestroy() { 
    super.onDestroy(); 

    // Stop the Background thread 
    isRunning = false; 

} 

private class BackgroundThread implements Runnable { 

    public void run() { 
     try { 
      while (isRunning) { 
       Log.d("service", "Thread started"); 
       new ManContents().getAll(getResources(), 
         getApplicationContext()); 
       isRunning = false; 
      } 
      stopSelf(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
} 

报警

public class Alarm extends BroadcastReceiver { 

@Override 
public void onReceive(Context context, Intent intent) { 
    context.startService(new Intent(context, ServiceBackground.class)); 
} 

public void setAlarm(Context context) { 
    String alarm = Context.ALARM_SERVICE; 
    AlarmManager am = (AlarmManager) context.getSystemService(alarm); 

    Intent intent = new Intent("moody_get_data"); 
    PendingIntent pi = PendingIntent.getBroadcast(context, 0, intent, 0); 

    int type = AlarmManager.ELAPSED_REALTIME_WAKEUP; 
    // long interval = AlarmManager.INTERVAL_FIFTEEN_MINUTES; 
    long interval = 1000 * 60 * 2; 
    long triggerTime = SystemClock.elapsedRealtime() + interval; 

    am.setRepeating(type, triggerTime, interval, pi); 

} 

public void CancelAlarm(Context context) { 
    Intent intent = new Intent(context, Alarm.class); 
    PendingIntent sender = PendingIntent 
      .getBroadcast(context, 0, intent, 0); 
    AlarmManager alarmManager = (AlarmManager) context 
      .getSystemService(Context.ALARM_SERVICE); 
    alarmManager.cancel(sender); 
} 

}

StartServiceReceiver

public class StartServiceReceiver extends BroadcastReceiver { 

@Override 
public void onReceive(Context context, Intent intent) { 
    Log.d("service", "Starting service from serviceReceiver"); 

    Intent service = new Intent(context, ServiceBackground.class); 
    context.startService(service); 
} 

}

注意

  • 我已经尝试过的情况下直接过滤器启动该服务,但对于 没有理由不要开始,所以使用过滤器是 工作的唯一方式。
  • 我也试过没有StartServiceReceiver.java,意图在报警器内但没有运气,如果有人认为它的问题,我可以再次更改代码。
  • 我在线程中的while(isRunning)只是为了将来的目的,但我认为它不是因为这个问题。
+0

您使用的是Htc设备吗?如果是这样,请检查:http://stackoverflow.com/questions/9525907/htcs-fast-boot-is-not-broadcasting-boot-completed-intent-nor-wiping-intents-f/18467723#18467723 – Lovis

+0

nop,我使用genyMotion模拟器和nexus 4 – firetrap

回答

3

我实现的一个比较,就是在清单中的微小差异:

  • 使用权限(似乎是与你

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

  • 等于

    收件人

    <receiver 
        android:name="com.<!your activity!>" 
        android:permission="android.permission.RECEIVE_BOOT_COMPLETED" > 
        <intent-filter> 
         <action android:name="android.intent.action.BOOT_COMPLETED" /> 
        </intent-filter> 
    </receiver> 
    

Yoiu看到有关权限的附加条目。

+0

你已经救了我的一天。谢谢!!很大的帮助:D我永远不会看到自己的入口。 – firetrap