0

我需要实现为所有用户显示应用程序新闻/公告的功能。我很少这样做,所以推送通知不适合我。

是否有任何库或示例,如何快速轻松地实现这个?或者更好的是用下一种方式实现它:

当应用程序启动时 - 读取服务器上的 html 文件,如果文件在上次尝试后更新 - 在弹出窗口中显示文件内容。

4

4 回答 4

1

如果公告不是很频繁,那么每次启动应用程序时检查服务器上的 html 文件就足够了。

于 2013-07-09T13:10:00.640 回答
1

您所需要的只是加载一个 html,或者更好的是,一个包含通知索引的简单文本文件,例如:

在 yourdomain.com/notificationnumber.txt 中包含“4”

签入您的应用程序,可能只需将 SharedPreferences 用于最后显示的版本。然后加载所有通知,例如:

yourdomain.com/notification3.html

yourdomain.com/notification4.html

显示它们并存储索引号以了解哪些通知已显示给用户。这样的任务不需要特殊的库。

于 2013-07-09T13:11:22.663 回答
0

我觉得这取决于您的通知所需的样式选项:

如果不需要丰富的样式,您可以像 bjornson 建议的那样简单地检查 XML 文件、文本文件或类似的通知信息(文本、通知编码),然后只显示带有特定信息的 AlertDialog。

如果您需要丰富的样式,您可能需要使用 WebView 从服务器加载内容。因此,例如,您的应用程序的首页可能部分包含一个 WebView,在特定情况下显示您打算呈现给用户的新闻。请注意,Facebook 使用/曾经使用 WebView 技术来更新其应用程序的某些部分,而无需在各种应用程序商店中发布新版本。

于 2013-07-09T13:21:03.683 回答
0

为此,我使用了来自 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 方法。这可能会奏效,而且工作量要少得多。

于 2013-07-09T13:29:00.930 回答