我需要实现为所有用户显示应用程序新闻/公告的功能。我很少这样做,所以推送通知不适合我。
是否有任何库或示例,如何快速轻松地实现这个?或者更好的是用下一种方式实现它:
当应用程序启动时 - 读取服务器上的 html 文件,如果文件在上次尝试后更新 - 在弹出窗口中显示文件内容。
我需要实现为所有用户显示应用程序新闻/公告的功能。我很少这样做,所以推送通知不适合我。
是否有任何库或示例,如何快速轻松地实现这个?或者更好的是用下一种方式实现它:
当应用程序启动时 - 读取服务器上的 html 文件,如果文件在上次尝试后更新 - 在弹出窗口中显示文件内容。
如果公告不是很频繁,那么每次启动应用程序时检查服务器上的 html 文件就足够了。
您所需要的只是加载一个 html,或者更好的是,一个包含通知索引的简单文本文件,例如:
在 yourdomain.com/notificationnumber.txt 中包含“4”
签入您的应用程序,可能只需将 SharedPreferences 用于最后显示的版本。然后加载所有通知,例如:
yourdomain.com/notification3.html
yourdomain.com/notification4.html
显示它们并存储索引号以了解哪些通知已显示给用户。这样的任务不需要特殊的库。
我觉得这取决于您的通知所需的样式选项:
如果不需要丰富的样式,您可以像 bjornson 建议的那样简单地检查 XML 文件、文本文件或类似的通知信息(文本、通知编码),然后只显示带有特定信息的 AlertDialog。
如果您需要丰富的样式,您可能需要使用 WebView 从服务器加载内容。因此,例如,您的应用程序的首页可能部分包含一个 WebView,在特定情况下显示您打算呈现给用户的新闻。请注意,Facebook 使用/曾经使用 WebView 技术来更新其应用程序的某些部分,而无需在各种应用程序商店中发布新版本。
为此,我使用了来自 wordpress 博客的 rss-feed,如果有新条目,则会打开一个 web 视图并显示新条目。不显示条目,可以只解析数据并显示 ist(使用jdom或其他库读取 html 文档)我们使用 IntentService 每小时检查一次,但您可以只在 strartup 上执行一次。
所以服务是这样构建的:
public class UpdateService extends IntentService
{
//INtent Services have a constructer where you have to pass a String to the super class.
public UpdateService()
{
super("UpdateService");
}
@Override
public IBinder onBind(Intent intent)
{
return null;
}
@Override
public void onCreate()
{
super.onCreate();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId)
{
super.onStartCommand(intent, flags, startId);
return Service.START_NOT_STICKY;
}
@Override
public void onDestroy()
{
super.onDestroy();
}
//This method downloads the file from a url and checks if its well formed. It has its own thread because android does not allow access to the internet in the same thread
private void checkfornews()
{
final SAXBuilder builder = new SAXBuilder();
new Thread(new Runnable()
{
public void run()
{
// command line should offer URIs or file names
try
{
Document doc = builder.build(url);
Element root = doc.getRootElement();
readnews(root);
// If there are no well-formedness errors,
// then no exception is thrown
}
// indicates a well-formedness error
catch (JDOMException e)
{
}
catch (IOException e)
{
}
}
}).start();
}
}
//checking for the lateste link, if its a new one we have a new link to show
private void readnews(Element root)
{
List<Element> children = root.getChildren();
Iterator<Element> childrenIterator = children.iterator();
while(childrenIterator.hasNext())
{
Element child = childrenIterator.next();
List<Element> grandchildren = child.getChildren();
Iterator<Element> grandchildrenIterator = grandchildren.iterator();
int counter=0;
while(grandchildrenIterator.hasNext())
{
Element grandchild = grandchildrenIterator.next();
String name = grandchild.getName();
if(name.equals("item") && counter ==0)
{
String title="";
String link="";
String category="";
List<Element> ggc = grandchild.getChildren();
Iterator<Element> ggci= ggc.iterator();
while(ggci.hasNext())
{
Element ggch = ggci.next();
if((ggch.getName()).equals("title"))
{
title=ggch.getText();
}
if(ggch.getName().equals("link"))
{
link=ggch.getText();
}
if(ggch.getName().equals("category"))
{
category=ggch.getText();
}
}
if(category.equals("SoundOfTheCity"))
{
counter++;
Logging.i(TAG, "found some news");
String latestnews = prefs.getString("SOTCNews", "");
if(!(latestnews.equals(link)))
{
Logging.i(TAG, "and its new");
Editor edit = prefs.edit();
edit.putString("SOTCNews", link);
edit.commit();
showNotification(title, link);
}
}
}
}
}
}
private void showNotification(String title, String link)
{
//do what needs to be done with the new data
}
@Override
protected void onHandleIntent(Intent intent)
{
checkfornews();
scheduleNext();
}
private void scheduleNext()
{
int checkingDelay = UPDATE_DELAY;
Calendar cal = Calendar.getInstance();
cal.add(Calendar.HOUR, checkingDelay);
Intent intent = new Intent(this, UpdateService.class);
PendingIntent pendingIntent = PendingIntent.getService(this, UPDATEALARM, intent, 0);
AlarmManager am = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
am.set(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), pendingIntent);
}
}
根据 html 文件的形式,您必须重做 readnews 方法,然后重做 showNotification 方法。
如果您不想拥有像 wordpress 这样的后端(或使用类似博客的功能),您可以只存储静态网页的内容而不是 url,如果此内容发生变化,请使用 showNotification 方法。这可能会奏效,而且工作量要少得多。