Android服务停止运行一段时间后请帮助

时间:2011-03-04 13:45:15

标签: android service

我在for循环中有一个服务但不知何故随着时间的推移它会死或循环结束。我已经在这一段时间了,任何建议或建议都会非常感激。谢谢!

以下是服务的启动方式

Intent myIntent = new Intent(this, MyService.class);
               pendingIntent = PendingIntent.getService(this, 0, myIntent, 0);
                 AlarmManager alarmManager = (AlarmManager)getSystemService(ALARM_SERVICE);
                 Calendar calendar = Calendar.getInstance();
                 calendar.setTimeInMillis(System.currentTimeMillis());
                 calendar.add(Calendar.SECOND, 10);
                 alarmManager.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent);

这是服务的Onstart命令

@Override
    public int onStartCommand(Intent intent, int flags, int startId) 
    {
     try{
            //Toast.makeText(getApplicationContext(), " Service Started", Toast.LENGTH_LONG).show();
                    @SuppressWarnings({ "rawtypes", "unchecked" })
                    AsyncTask<Void, Void, Void> asyncTask = new AsyncTask() {
                            @Override
                            protected void onPreExecute() {
                            }

                            @Override
                            protected Void doInBackground(Object... objects) {
                                //Get Username from sql not static value. Static value could die.
                                String Username = "";
                                SQLiteDatabase db;
                                db = openOrCreateDatabase(".db",SQLiteDatabase.CREATE_IF_NECESSARY,null);
                                db.setVersion(1);
                                db.setLocale(Locale.getDefault());
                                db.setLockingEnabled(true);
                                Cursor cur =db.query("userdata", null, null, null, null, null, null);
                                 cur.moveToFirst();
                                while(cur.isAfterLast()==false){ 
                                    Username = (cur.getString(cur.getColumnIndex("username")));
                                        cur.moveToNext();
                                }
                                cur.close();
                                db.close();
                                int messagecount = -1;
                                //START MAIN LOOP TO CHECK NEW MESSAGES
                                /*
                                 * Counts starts at -1 then gets count then if 1 is
                                 * added to newcount newcount is > than last message count
                                 * notify uesers.
                                 */
                                for(;;){

                                    try{
                                     String result = "";
                                    //Shownotify();//WILL LOOP ALL THE TIME: LOOP TEST
                                    HttpClient client = new DefaultHttpClient();
                                    HttpPost request = new HttpPost("http:GetInfo.php");
                                     List<NameValuePair> postParameters = new ArrayList<NameValuePair>();
                                     postParameters.add(new BasicNameValuePair("UserName", Username));
                                     UrlEncodedFormEntity formEntity = new UrlEncodedFormEntity(postParameters);
                                     request.setEntity(formEntity);
                                     HttpResponse response = client.execute(request);
                                     HttpEntity entity = response.getEntity();
                                     InputStream is = entity.getContent();
                                     BufferedReader reader  = new BufferedReader(new
                                            InputStreamReader(is,"iso-8859-1"),8);
                                     StringBuilder sb = new StringBuilder();
                                     String line = null;
                                     while((line = reader.readLine())!= null){
                                        sb.append(line + "\n");

                                     }
                                     is.close();
                                     result = sb.toString();
                                           JSONArray jArray = new JSONArray(result);
                                           int newcount = 0;
                                           for(int i=0;i<jArray.length(); i++){
                                                   JSONObject json_data = jArray.getJSONObject(i);
                                                  newcount = json_data.getInt("counter");
                                           }
                                           if(MyGlobalInformation.getStopLoop() == true){
                                               break;
                                           }
                                           if(newcount > messagecount && messagecount != -1){
                                               messagecount = newcount;
                                          Shownotify();
                                           }
                                           else{
                                              messagecount = newcount;
                                           }
                                     }

                                    catch(Exception e){
                                    HomeScreen.setStartedState(false);
                                    }

                            }

                                    return null;
                            }


                        @Override
                        protected void onPostExecute(Object o) {
                            HomeScreen.setStartedState(false);
                        }
                    };
                        asyncTask.execute();

            }
            catch(Exception e){
                HomeScreen.setStartedState(false);
                            }

        return START_STICKY;
    }

1 个答案:

答案 0 :(得分:4)

您的服务不是前台,因此可以随时终止。您可以使用Service.startForeground解决问题。您也可以通过从onStartCommand返回START_REDELIVER_INTENT进行修复,然后{...}}将再次以相同的意图调用您的服务。有关服务生命周期的更多信息,请查看文档的this part