2013-08-31 54 views
0

每隔一小时我有使用报警管理器的更新我的服务有问题,因为我不知道真正的位置,把这个代码豌豆:如何使用报警管理器更新服务的Android

SharedPreferences sp = getSharedPreferences("updateOptions", 0); 
     int updatePeriod=sp.getInt("UpdatePeriod", -1); 


     Calendar cal = Calendar.getInstance(); 

     Intent i = new Intent(this, UpdateWidgetService.class); 
     PendingIntent pintent = PendingIntent.getService(this, 0, intent, 0); 

     AlarmManager alarm = (AlarmManager)getSystemService(Context.ALARM_SERVICE); 

     alarm.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), updatePeriod, pintent); 

在事实上我的任务是通过新项目的总数如果在XML文件新项目(新闻源)来更新我的应用程序插件:

enter image description here

来执行我用2类:

1- UpdateWidgetService:

package com.example.testfeeds; 

import java.io.IOException; 
import java.io.InputStream; 
import java.net.MalformedURLException; 
import java.net.URL; 
import java.net.URLConnection; 
import java.text.ParseException; 
import java.text.SimpleDateFormat; 
import java.util.ArrayList; 
import java.util.Calendar; 
import java.util.Date; 
import java.util.Random; 

import org.xmlpull.v1.XmlPullParser; 
import org.xmlpull.v1.XmlPullParserException; 
import org.xmlpull.v1.XmlPullParserFactory; 

import android.annotation.SuppressLint; 
import android.app.AlarmManager; 
import android.app.PendingIntent; 
import android.app.Service; 
import android.appwidget.AppWidgetManager; 
import android.content.ComponentName; 
import android.content.Context; 
import android.content.Intent; 
import android.content.SharedPreferences; 
import android.graphics.Color; 
import android.os.IBinder; 
import android.util.Log; 
import android.webkit.WebView.FindListener; 
import android.widget.ArrayAdapter; 
import android.widget.ListView; 
import android.widget.RemoteViews; 
import android.widget.TextView; 


public class UpdateWidgetService extends Service { 

    public static int numberOfItems=0; 



    //numberOfItems=0; 
    private static String LOG = "testwidgets"; 



    ArrayList<String> feedsPubDate; 

     @SuppressWarnings("deprecation") 
    @Override 
     public void onStart(Intent intent, int startId) { 
     Log.i(LOG, "Called"); 
     // Create some random data 

     feedsPubDate=new ArrayList<String>(); 


     ///////////////////////////////////////////////////////////////////// 


     SharedPreferences sp = getSharedPreferences("updateOptions", 0); 
     int updatePeriod=sp.getInt("UpdatePeriod", -1); 


     Calendar cal = Calendar.getInstance(); 

     Intent i = new Intent(this, UpdateWidgetService.class); 
     PendingIntent pintent = PendingIntent.getService(this, 0, intent, 0); 

     AlarmManager alarm = (AlarmManager)getSystemService(Context.ALARM_SERVICE); 

     alarm.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), updatePeriod, pintent); 





     ////////////////////////////////////////////////////////////////////// 


     AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(this 
      .getApplicationContext()); 

     int[] allWidgetIds = intent 
      .getIntArrayExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS); 

     ComponentName thisWidget = new ComponentName(getApplicationContext(), 
      MyWidgetProvider.class); 
     int[] allWidgetIds2 = appWidgetManager.getAppWidgetIds(thisWidget); 
     Log.w(LOG, "From Intent" + String.valueOf(allWidgetIds.length)); 
     Log.w(LOG, "Direct" + String.valueOf(allWidgetIds2.length)); 

     for (int widgetId : allWidgetIds) { 
      // Create some random data 



///////////////////////////////////////////////////////////////////////////  

      RemoteViews remoteViews = new RemoteViews(this 
       .getApplicationContext().getPackageName(), 
       R.layout.widget_layout); 

      Log.d("numberOfItems intially", String.valueOf(numberOfItems)); 

       try { 
       numberOfItems=doTestFeed(); 
      } catch (MalformedURLException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } catch (ParseException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 

      // Set the text 
      remoteViews.setTextColor(R.id.title3,Color.WHITE); 
      remoteViews.setTextViewText(R.id.title3," "+ 
       String.valueOf(numberOfItems)); 

      Log.w(LOG, String.valueOf(numberOfItems)); 


////////////////////////////////////////////////////////////////////////////   

      // Register an onClickListener 
      Intent clickIntent = new Intent(this.getApplicationContext(), 
       MyWidgetProvider.class); 

      clickIntent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE); 
      clickIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, 
       allWidgetIds); 

      PendingIntent pendingIntent = PendingIntent.getBroadcast(getApplicationContext(), 0, clickIntent, 
       PendingIntent.FLAG_UPDATE_CURRENT); 
      remoteViews.setOnClickPendingIntent(R.id.title3, pendingIntent); 
      appWidgetManager.updateAppWidget(widgetId, remoteViews); 
     } 
     stopSelf(); 

     super.onStart(intent, startId); 
     } 

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


    int doTestFeed() throws MalformedURLException, ParseException 

    { 
     Log.d("msg"," in do test feed"); 

     InputStream is = null; 
     int x = 0; 

     URL myURL = new URL("http://yunn.yu.edu.jo/index.php?option=com_content&view=category&id=55&layout=blog&Itemid=104&format=feed&type=rss"); 
     try { 
      URLConnection conn = myURL.openConnection(); 
      is = conn.getInputStream(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

     XmlPullParserFactory pullParserFactory; 

     try { 
      pullParserFactory = XmlPullParserFactory.newInstance(); 
      XmlPullParser parser = pullParserFactory.newPullParser(); 
       parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false); 
       parser.setInput(is, null); 
       Log.d("msg","before making parsing"); 
       x=parseXML(parser); 
       Log.d("msg","after making parsing"); 
     } catch (XmlPullParserException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 

      e.printStackTrace(); 
     } 


     Log.d("msg"," done testing"); 
     return x; 
    } 


////////////////////////////////////////////////////////////////////////////////// 

    @SuppressLint("SimpleDateFormat") 
    private int parseXML(XmlPullParser parser) throws XmlPullParserException,IOException, ParseException 
    { 

     Log.d("msg"," in parser"); 

     int eventType = parser.getEventType(); 
     int getElement=0; 
     String pubDate=null; 






     while (eventType != XmlPullParser.END_DOCUMENT){ 

      String tagName = null; 


      switch (eventType){ 

      //----------------------------------// 
      case XmlPullParser.START_DOCUMENT: 
       { 
        // do nothing 
       } 
       break; 
      //----------------------------------// 
      case XmlPullParser.START_TAG: 
      { tagName = parser.getName(); 
       if ("item".equals(tagName)){ 
         getElement=1; 
       } else if (getElement!=0){ 

         if ("pubDate".equals(tagName)){ 
         pubDate= parser.nextText(); 

         feedsPubDate.add(pubDate); 
         Log.d("value",pubDate); 
        } 
       } 
      } 
       break;      
      //----------------------------------// 
      case XmlPullParser.END_TAG: 
      { tagName = parser.getName(); 
       if (tagName.equalsIgnoreCase("item") && getElement != 0){ 

       } 
      } 
       break; 

      //----------------------------------// 


      }// end-switch. 


      eventType= parser.next(); 

     }// end-while. 

     int i=0; 

     SharedPreferences sp = getSharedPreferences("tempData", 0); 
     String dateStringA=sp.getString("recentPubDate", null); 

     Log.d("oldest date",dateStringA); 

     for(String s : feedsPubDate) 

     { 

     String dateStringB = feedsPubDate.get(i); 
     SimpleDateFormat parserSDF = new SimpleDateFormat("EEE, DD MMM yyyy HH:mm:ss"); 
     Date dateA = parserSDF.parse(dateStringA); 
     Date dateB = parserSDF.parse(dateStringB); 
     if (dateA.compareTo(dateB) < 0) { 


      Log.d("imp msg","one new item"); 

      numberOfItems++; 
     } 

     i++; 

     } 


     Log.d("update result", String.valueOf(numberOfItems)); 


     // Toast.makeText(GeneralNews.this,"The size of the list"+feedsTitles.size() , Toast.LENGTH_LONG).show(); 

    return numberOfItems; 

    } //end xmlParser method. 

////////////////////////////////////////////////////////////////////////////////// 

} 

2- MyWidgetProvider:

package com.example.testfeeds; 

import android.os.Bundle; 
import android.app.Activity; 
import android.app.AlarmManager; 
import android.view.Menu; 

import java.util.Calendar; 
import java.util.Random; 

import android.app.PendingIntent; 
import android.appwidget.AppWidgetManager; 
import android.appwidget.AppWidgetProvider; 
import android.content.ComponentName; 
import android.content.Context; 
import android.content.Intent; 
import android.util.Log; 
import android.widget.RemoteViews; 

public class MyWidgetProvider extends AppWidgetProvider { 

    private static final String LOG = "testwidgets"; 

     @Override 
     public void onUpdate(Context context, AppWidgetManager appWidgetManager, 
      int[] appWidgetIds) { 



     Log.w(LOG, "onUpdate method called"); 
     // Get all ids 
     ComponentName thisWidget = new ComponentName(context, 
      MyWidgetProvider.class); 
     int[] allWidgetIds = appWidgetManager.getAppWidgetIds(thisWidget); 

     // Build the intent to call the service 
     Intent intent = new Intent(context.getApplicationContext(), 
      UpdateWidgetService.class); 
     intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, allWidgetIds); 

     // Update the widgets via the service 
     context.startService(intent); 
     } 

} 

结果是不正确:问题1 - >每秒更新服务被调用,而更新周期为3600000毫秒! 问题2 - >一旦更新服务被称为“numberOfItems”加1!即使没有项目的日期最新为我的应用程序! 其实我不能指出逻辑错误!报警管理器的使用位置是问题吗?

回答

2

只需使用Handler,见下图:

private int mSampleDurationTime = 3600000; // 1 hour 
private boolean continueToRun = true; 

Handler mHandler = new Handler(); 

mHandler.postDelayed(mRunnable, mSampleDurationTime); 

其中mRunnable是你的任务:

private final Runnable mRunnable = new Runnable() { 

//... 
public void run() { 

    // do your stuff here, like update 
    // this block of code you going to reach every 1 hour 

    if(continueToRun == true){ 
    mHandler.postDelayed(mRunnable, mSampleDurationTime); 
    } 

} 
    ... 
}; 

你打电话postDelayed并调用new Runnable()第一次。之后,如果你想继续, 调用相同的方法进run()

+0

在任何班级我应该把这个豌豆代码?我如何通过使用此代码更新小部件? – Akari

+1

您可以在主Activity或Service中使用处理程序。处理程序就像定时器,你可以在一段时间后运行任何命令 –

1

问题1 - >每秒更新服务被称为同时 更新周期是3600000毫秒

确定即

int updatePeriod = sp.getInt(“UpdatePeriod”,-1);

返回3600000?如果返回-1,这意味着你的UpdatePeriod已调用服务之前正确保存和setRepeating会被称为每cal.getTimeInMillis()意味着无休止地

problem 2 --> once the update service is called the "numberOfItems" incremented by one !! even if there are no items its dates newest for my app !! 尝试,而不是这个

if (dateA.compareTo(dateB) <= 0) 

if (dateA.compareTo(dateB) < 0) 

和你一样,我会用一个闹钟来调用AppWdiget的接收器。但是,如果计算时间存在错误(正如您所遇到的那样),我使用Alarm#set而不是setRepeating来避免问题。 因此,每次我收到我的第一次报警的意图,我设置了另外1个报警发生在now()+interval

+0

是它的-1 ...如何解决问题<<问题#1与此代码 – Akari

+1

只是为了测试你的报警管理器,如果它的工作与否,你可以使用int updatePeriod = sp.getInt(“UpdatePeriod”,3600000);所以如果UpdatePeriod首选项不存在,它将返回3600000 – ccheneson