我需要实现为所有用户显示应用程序新闻/公告的功能。 我很少这样做,所以推送通知不适合我。
是否有任何库或样本,如何快速简便地实现?或者更好的方法是以下一种方式实施它:
当应用程序启动时 - 在服务器上读取html文件,如果文件在上次尝试后更新 - 在弹出窗口中显示文件内容。
答案 0 :(得分:1)
如果公告不是很频繁,那么每次启动应用程序时检查服务器上的html文件就足够了。
答案 1 :(得分:1)
您只需要加载一个html或更好的包含通知索引的简单文本文件,如:
在yourdomain.com/notificationnumber.txt中 包含 “4”
签入您的应用程序,可能只是使用SharedPreferences获取最后显示的版本。然后加载所有通知,例如:
yourdomain.com/notification3.html
yourdomain.com/notification4.html
显示它们并存储索引号以了解向用户显示了哪些通知。这样的任务不需要特殊的库。
答案 2 :(得分:0)
我觉得这取决于您的通知所需的样式选项:
如果不需要丰富的样式,您可以简单地检查XML文件,文本文件或类似的一些通知信息(文本,通知编码),如bjornson建议的那样,然后只显示带有特定信息的AlertDialog。
如果您需要丰富的样式,则可能需要使用WebView从服务器加载内容。因此,例如,您的应用程序的首页可能部分由WebView组成,在特定情况下会显示您打算向用户呈现的新闻。请注意,Facebook使用WebView技术来更新其应用程序的某些部分,而没有在各种应用程序商店中发布新版本的麻烦。
答案 3 :(得分:0)
我使用了wordpress博客的rss-feed,如果有新条目,则打开webview并显示新条目。可以只解析数据并显示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这样的后端(或使用类似博客的功能),您可以只存储静态网页的内容而不是网址,如果此内容发生更改,请使用showNotification方法。这可能会成功,而且工作量也少得多。