2012-10-12 144 views
2

在我的活動之一Activity_A狀態欄通知我已經推翻的onResume()這樣:安卓:使用服務

protected void onResume() { 

super.onResume(); 
AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE); 
Intent i = new Intent(this, NotificationsService.class); 
PendingIntent pi = PendingIntent.getService(this, 0, i, PendingIntent.FLAG_UPDATE_CURRENT); 
am.cancel(pi); 
am.setInexactRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime() + 20000, 20000, pi); 
} 

後20秒開始通知,然後重複每20秒。

但是這不起作用,即使5-10分鐘後我還沒有收到任何通知。我錯過了什麼。

NotificationService類:

public class NotificationsService extends Service { 

    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 

     handleIntent(intent); 
     return START_NOT_STICKY; 
    } 

    private NotificationManager nm; 
    private WakeLock mWakeLock; 

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

    @Override 
    public void onDestroy() { 
     super.onDestroy(); 
     mWakeLock.release(); 
    } 

    private void showNotification() { 

     nm = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); 
     Notification notification = new Notification(R.drawable.icon, 
       "This is a Notification", System.currentTimeMillis()); 
     notification.flags = Notification.FLAG_AUTO_CANCEL; 
     Intent i = new Intent(this, Activity_B.class); 
     PendingIntent contentIntent = PendingIntent.getActivity(this, 0, i, 
       PendingIntent.FLAG_UPDATE_CURRENT); 
     notification.setLatestEventInfo(this, "New Notifications", 
       "Notification Content", contentIntent); 
     nm.notify(R.string.app_name, notification); 
    } 

    private class PollTask extends AsyncTask<Void, Void, Void> { 

     @Override 
     protected Void doInBackground(Void... params) { 
      showNotification(); 
      return null; 
     } 

     @Override 
     protected void onPostExecute(Void result) { 

      stopSelf(); 
     } 
    } 

    private void handleIntent(Intent intent) { 

     PowerManager pm = (PowerManager) getSystemService(POWER_SERVICE); 
     mWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, 
       "NotificationsService"); 
     mWakeLock.acquire(); 
     ConnectivityManager cm = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE); 
     if (!cm.getBackgroundDataSetting()) { 
      stopSelf(); 
      return; 
     } 
     new PollTask().execute(); 
    } 
} 

和我BroadcastService類調用這個通知是:

public class MyScheduleReceiver extends BroadcastReceiver { 

    private static final long REPEAT_TIME = 60000; 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     AlarmManager service = (AlarmManager) context 
       .getSystemService(Context.ALARM_SERVICE); 
     Intent i = new Intent(context, NotificationsService.class); 
     PendingIntent pending = PendingIntent.getService(context, 0, i, 
       PendingIntent.FLAG_CANCEL_CURRENT); 
     service.cancel(pending); 
     service.setInexactRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, 
       SystemClock.elapsedRealtime() + REPEAT_TIME, REPEAT_TIME, pending); 
    } 
} 

,我已經在manifest.xml包含在此爲:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.Android.WiC_MobileApp" 
    android:versionCode="1" 
    android:versionName="1.0" > 

    <uses-sdk 
     android:minSdkVersion="10" 
     android:targetSdkVersion="14" /> 

    <uses-feature android:name="android.hardware.camera" /> 
    <uses-feature android:name="android.hardware.camera.autofocus" /> 

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

    <application 
     android:icon="@drawable/ic_launcher" 
     android:label="@string/app_name" 
     android:theme="@android:style/Theme.Light" > 
     <activity 
      android:name=".Activity_A" 
      android:configChanges="orientation|keyboardHidden" 
      android:label="@string/app_name" 
      android:screenOrientation="portrait" > 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
     <activity 
      android:name=".Activity_B" 
      android:configChanges="orientation|keyboardHidden" 
      android:excludeFromRecents="true" 
      android:label="@string/app_name" 
      android:launchMode="singleTask" 
      android:screenOrientation="portrait" 
      android:taskAffinity="" /> 

     <service 
      android:name="NotificationsService" 
      android:icon="@drawable/icon" 
      android:label="Notifications" 
      android:process=":my_process" > 
     </service> 

     <receiver android:name=".MyScheduleReceiver" > 
      <intent-filter> 
       <action android:name="android.intent.action.BOOT_COMPLETED" /> 
      </intent-filter> 
     </receiver> 
    </application> 

</manifest> 

謝謝

回答

0

的問題是與服務名稱在清單

<service 
    android:name="NotificationsService" 
    android:icon="@drawable/icon" 
    android:label="Notifications"> 
</service> 

的服務是不是在同一個包中的活性,因此,將其更改爲以下工作。

<service 
    android:name="com.android.myApp.Services.NotificationsService" 
    android:icon="@drawable/icon" 
    android:label="Notifications"> 
</service> 
1

你應該改變PendingIntent.getServicePendingIntent.getActivity

+0

啊。是的,它的作品。非常感謝。但是你有什麼想法,爲什麼服務不工作?我在問題 –

+0

中添加了我的服務類,我嘗試了不使用am.cancel並使用am.set代替setInexactRepeating。另外,我會將AlarmManager.ELAPSED_REALTIME_WAKEUP更改爲AlarmManager.RTC_WAKEUP和SystemClock.elapsedRealtime()更改爲System.currentTimeMillis() – Givi