如何向我的应用程序的所有用户显示消息?

时间:2013-07-09 13:06:26

标签: android

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

是否有任何库或样本,如何快速简便地实现?或者更好的方法是以下一种方式实施它:

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

4 个答案:

答案 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方法。这可能会成功,而且工作量也少得多。