2016-02-17 96 views
0

所以我有這樣的代碼,管理運行服務時的時間主頻爲上午9:30如何在應用程序關閉時使服務在後臺運行?

Calendar cal = Calendar.getInstance(); 
     cal.setTimeInMillis(System.currentTimeMillis()); 
     cal.set(Calendar.HOUR_OF_DAY, 9); 
     cal.set(Calendar.MINUTE,30); 


     Intent start = new Intent(getActivity(), Services.class); 
     PendingIntent PI = PendingIntent.getService(getActivity(), 0, start, 0); 
     AlarmManager am = (AlarmManager)getActivity().getSystemService(getActivity().ALARM_SERVICE); 
     //am.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), 1000*60*60*24, PI); 
     am.setInexactRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(),AlarmManager.INTERVAL_DAY, PI); 
     getActivity().startService(new Intent(getActivity(), Services.class)); 

它的工作,當我打開的應用程序,但是當我關閉應用程序,服務沒有運行在所有。該服務應該顯示根據此代碼的通知

package apps.skripsi.petvac.Services; 

import android.app.IntentService; 
import android.app.NotificationManager; 
import android.app.PendingIntent; 
import android.app.ProgressDialog; 
import android.app.Service; 
import android.content.Context; 
import android.content.DialogInterface; 
import android.content.Intent; 
import android.media.RingtoneManager; 
import android.net.Uri; 
import android.os.AsyncTask; 
import android.os.Handler; 
import android.os.IBinder; 
import android.support.v4.app.NotificationCompat; 
import android.support.v4.widget.SwipeRefreshLayout; 
import android.support.v7.app.AlertDialog; 
import android.util.Log; 
import android.view.View; 
import android.widget.AdapterView; 
import android.widget.ImageView; 
import android.widget.ListView; 
import android.widget.TextView; 
import android.widget.Toast; 

import org.apache.http.client.ClientProtocolException; 
import org.joda.time.DateTime; 
import org.joda.time.Days; 
import org.json.JSONArray; 
import org.json.JSONException; 
import org.json.JSONObject; 

import java.io.IOException; 
import java.text.DateFormat; 
import java.text.ParseException; 
import java.text.SimpleDateFormat; 
import java.util.ArrayList; 
import java.util.Calendar; 
import java.util.Date; 
import java.util.HashMap; 
import java.util.Locale; 

import apps.skripsi.petvac.MainMenu.MainMenuAdapter; 
import apps.skripsi.petvac.R; 
import apps.skripsi.petvac.navigationmenu.MainMenu; 
import apps.skripsi.petvac.notification.NotificationButtonReceiver; 
import apps.skripsi.petvac.parser.JSONParser; 
import apps.skripsi.petvac.petinformation.MainPetInformation; 
import apps.skripsi.petvac.preference.PreferencesHelper; 


public class Services extends IntentService { 
    Handler handler = new Handler(); 
    PreferencesHelper ph; 
    MainMenu mm; 
    JSONObject json; 
    JSONObject jsonObject; 
    NotificationManager mNotificationManager; 
    int days; 
    String result, result2; 
    String sisaWaktu, sisa_hari; 
    String ID_USER, ID_BINATANG, NAMA_BINATANG, JENIS_BINATANG, FOTO_BINATANG, RAS_BINATANG, TANGGAL_VAKSIN, NAMA_VAKSIN, STATUS_VAKSIN, ID_DATA_WAKTU_VAKSINASI; 

    ArrayList<HashMap<String, String>> listBinatang = new ArrayList<HashMap<String, String>>(); 

    public static String id_user = "id_user"; 
    public static String id_binatang = "id_binatang"; 
    public static String nama_binatang = "nama_binatang"; 
    public static String jenis_binatang = "jenis_binatang"; 
    public static String foto_binatang = "foto_binatang"; 
    public static String ras_binatang = "ras_binatang"; 
    public static String tanggal_vaksin = "tanggal_vaksin"; 
    public static String nama_vaksin = "nama_vaksin"; 
    public static String jumlah_hari; 
    public static String status_vaksin = "status_vaksin"; 
    public static String id_data_waktu_vaksinasi = "id_data_waktu_vaksinasi"; 

    private Context context; 

    private static String url = "http://petvaccination.hol.es/api/data_menu_utama_vaksinasi.php"; 

    public Services() { 
     super("Services"); 
    } 

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

    @Override 
    protected void onHandleIntent(Intent intent) { 

    } 

    @Override 
    public void onCreate() { 
     // TODO Auto-generated method stub 
     super.onCreate(); 
     System.out.println("create"); 

    } 

    @SuppressWarnings("static-access") 
    @Override 
    public void onStart(Intent intent, int startId) { 

     ph = new PreferencesHelper(getApplicationContext()); 
     mm = new MainMenu(); 

/*   // TODO Auto-generated method stub 
      new Handler().postDelayed(new Thread() { 
       public void run() { 
        super.run(); 
         handler.postDelayed(this, 30000);*/ 
         new DataBinatangOperation().execute(url); 
         Toast.makeText(Services.this,"Muncul",Toast.LENGTH_SHORT).show(); 
/* 
       } 
      }, 5000);*/ 
     } 


    @Override 
    public void onDestroy() { 
     // TODO Auto-generated method stub 
     handler.removeCallbacks(null); 
     System.out.println("destroy"); 
     super.onDestroy(); 
    } 

    public class DataBinatangOperation extends AsyncTask<String, Void, String> { 


     @Override 
     protected String doInBackground(String... params) { 

      JSONArray json; 
      try { 
       result = JSONParser.getPage(url); 
      } catch (ClientProtocolException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 

      return result; 

     } 


     @Override 
     protected void onPostExecute(String result) { 

      try { 
       System.out.print("result = " + result); 
       json = new JSONObject(result); 
       //progress.dismiss(); 

       JSONArray objek = json.getJSONArray("data_vaksinasi_menu"); 

       for (int i = 0; i < objek.length(); i++) { 

        JSONObject jo = objek.getJSONObject(i); 

        ID_USER = jo.getString(id_user); 
        ID_BINATANG = jo.getString(id_binatang); 
        NAMA_BINATANG = jo.getString(nama_binatang); 
        JENIS_BINATANG = jo.getString(jenis_binatang); 
        FOTO_BINATANG = jo.getString(foto_binatang); 
        RAS_BINATANG = jo.getString(ras_binatang); 
        ID_DATA_WAKTU_VAKSINASI = jo.getString(id_data_waktu_vaksinasi); 
        TANGGAL_VAKSIN = jo.getString(tanggal_vaksin); 
        NAMA_VAKSIN = jo.getString(nama_vaksin); 
        STATUS_VAKSIN = jo.getString(status_vaksin); 

        if (ph.getPreferences("ID").equals(ID_USER)) { 


          DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd", Locale.getDefault()); 

          Calendar waktuSekarang = Calendar.getInstance(); 

          Date date1 = waktuSekarang.getTime(); 
          Date date2 = new Date(); 

          date2 = formatter.parse(TANGGAL_VAKSIN); 

          if (date2.after(date1)) { 
           days = Days.daysBetween(new DateTime(date1), new DateTime(date2)).getDays(); 
           if (days > 7 && days <= 30) { 
            int weeks = days/7; 
            sisa_hari = String.valueOf(days); 
            sisaWaktu = String.valueOf(weeks) + " minggu"; 
           } else if (days > 30 && days <= 365) { 
            int months = days/30; 
            sisa_hari = String.valueOf(days); 
            sisaWaktu = String.valueOf(months) + " bulan"; 
           } else if (days > 365) { 
            int years = days/365; 
            sisa_hari = String.valueOf(days); 
            sisaWaktu = String.valueOf(years) + " tahun"; 
           } else { 
            sisaWaktu = String.valueOf(days) + " hari"; 
            if (days <= 5) { 
             sisa_hari = String.valueOf(days); 
             /*if(!result.equals(result2)) {*/ 
             createSimpleNotification(context, NAMA_BINATANG, sisa_hari, ID_BINATANG); 
             /* }*/ 
            } 
           } 
          } else if (date2.before(date1)) { 
           days = Days.daysBetween(new DateTime(date2), new DateTime(date1)).getDays(); 
           if (days == 0) { 
            sisaWaktu = "sekarang"; 
            sisa_hari = String.valueOf(days); 
            if (STATUS_VAKSIN.equals("belum")) { 
             /*if(!result.equals(result2)) {*/ 
             createButtonNotification(context, NAMA_BINATANG, sisaWaktu, sisa_hari, ID_BINATANG, ID_DATA_WAKTU_VAKSINASI); 
             /*}else { 
              return; 
             }*/ 
            }/*else{ 
             return; 
            }*/ 
           } else { 
            sisaWaktu = "lewat " + String.valueOf(days) + " hari"; 
            sisa_hari = String.valueOf(days); 
            if (STATUS_VAKSIN.equals("belum")) { 
             /*if(!result.equals(result2)){*/ 
             createButtonNotification(context, NAMA_BINATANG, sisaWaktu, sisa_hari, ID_BINATANG, ID_DATA_WAKTU_VAKSINASI); 
             /*}else{ 
              return; 
             }*/ 
            } 
           } 
          } 

         } 

        } 







      } catch (JSONException e1) { 
       // TODO Auto-generated catch block 
       e1.printStackTrace(); 
      } catch (ParseException e) { 
       e.printStackTrace(); 
      } 

     } 

     @Override 
     protected void onPreExecute() { 

     } 

     @Override 
     protected void onProgressUpdate(Void... values) { 
     } 
    } 

    public void createSimpleNotification(Context context, String nama_binatang, String sisa_hari, String id) { 

     Intent resultIntent = new Intent(getApplicationContext(), MainPetInformation.class); 
     resultIntent.putExtra("IDB", id); 
     resultIntent.putExtra("SW", sisa_hari); 
     resultIntent.putExtra("IDVAK", ""); 

     mNotificationManager = (NotificationManager) getApplicationContext().getSystemService(this.NOTIFICATION_SERVICE); 

     int IntID = Integer.valueOf(id); 

     Uri uri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); 

     PendingIntent resultPending = PendingIntent.getActivity(getApplicationContext(), IntID, resultIntent, PendingIntent.FLAG_UPDATE_CURRENT); 

     NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this) 
       .setSmallIcon(R.drawable.logo) 
       .setContentTitle(nama_binatang) 
       .setContentText(sisa_hari + " hari lagi") 
       .setSound(uri) 
       .setContentIntent(resultPending); 

     mNotificationManager.notify(IntID, mBuilder.build()); 
    } 

    public void createButtonNotification(Context context, String nama_binatang, String sisa_waktu, String sisa_hari, String idb, String idv) { 

     Log.d("idb", idb); 

     int IntID = Integer.valueOf(idb); 
     int sisaHari = Integer.valueOf(sisa_hari); 
     String sisa_hari2; 

     Intent intent = new Intent(getApplicationContext(), MainPetInformation.class); 

     intent.putExtra("IDB", idb); 
     intent.putExtra("IDVAK", idv); 
     if (sisaHari > 0) { 
      sisa_hari2 = "-" + sisa_hari; 
      intent.putExtra("SW", sisa_hari2); 
     } else if (sisaHari == 0) { 
      intent.putExtra("SW", sisa_hari); 
     } 

     Intent cancelIntent = new Intent(getApplicationContext(), NotificationButtonReceiver.class); 
     cancelIntent.putExtra("notifID", IntID); 

     mNotificationManager = (NotificationManager) getApplicationContext().getSystemService(this.NOTIFICATION_SERVICE); 

     Uri uri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); 


     PendingIntent IntentAccept = PendingIntent.getActivity(getApplicationContext(), IntID, intent, PendingIntent.FLAG_UPDATE_CURRENT); 

     PendingIntent IntentCancel = PendingIntent.getActivity(getApplicationContext(), IntID, cancelIntent, 0); 

     // Building the notifcation 
     NotificationCompat.Builder nBuilder = new NotificationCompat.Builder(this) 
       .setSmallIcon(R.drawable.logo) 
       .setContentTitle(nama_binatang) 
       .setContentText(sisa_waktu) 
       .setSound(uri) 
       .addAction(R.drawable.accept, "Accept", IntentAccept) 
       .addAction(R.drawable.cancel, "Cancel", IntentCancel); 

     nBuilder.setAutoCancel(true); 
     mNotificationManager.notify(IntID, nBuilder.build()); 


    } 
} 

任何解決方案,使其在後臺運行,即使應用程序關閉?

+0

我是你的manifet文件中聲明的服務類已經使用AlarmManager服務來解決類似的問題。 –

+0

@AhmedFarazHashmi你怎麼做的?我也使用了報警管理器 –

+0

在此論壇中搜索「使用Alarmmanager在特定時間啓動服務」 –

回答

0

您可以使用警報管理要做到這一點

Calendar cur_cal = Calendar.getInstance(); 
     cur_cal.setTimeInMillis(System.currentTimeMillis()); 
     cur_cal.add(Calendar.SECOND, 50); 

    Intent intent = new Intent(YourActivity.this, ServiceClass.class); 
    PendingIntent pintent = PendingIntent.getService(YourActivity.this, 0, intent, 0); 
    AlarmManager alarm = (AlarmManager)getSystemService(Context.ALARM_SERVICE); 
    alarm.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), 30*1000, pintent); 

還可以確保你在這樣

<service android:enabled="true" android:name=".ServiceClass" /> 

希望這將有助於你

+0

讓我知道您的結果 – saeed

相關問題