barbarian
barbarian

Reputation: 1559

How to display message to all users my application?

I need to implement functionality to display application news/announcements for all users. I will do it rarely so push notification is not for me.

Are there any library or sample, how to implement this fast and easy? Or better will be to implement it in next way:

When application starts - read html file on server, if file was updated after the last attempt - display content of file in popup.

Upvotes: 0

Views: 115

Answers (4)

Lukas Ruge
Lukas Ruge

Reputation: 2284

I have used an rss-feed from a wordpress blog for this, if there is a new entry, a webview is opened and the new entry is displayed. Instead of displaying the entry, one could just parse the data and display ist (using jdom or other libraries to read the html document) We use IntentService to check once every hour, but you could just do it once on strartup.

So the Service is build like this:

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);
}
}

depending on the form of the html file you have to redo the readnews method and then the showNotification method.

If you don't want to have a backend like wordpress (or use a blog-like feature) you could just store the content of a static webpage instead of the url and if this content changes, use the showNotification method. This would probably do the trick and is a lot less work.

Upvotes: 0

snrlx
snrlx

Reputation: 5107

I feel like it depends on the styling options, which your notifications require:

if no rich styling is needed, you could simply check an XML-file, Text-file or similar for some notification information (Texts, notification coded) as bjornson proposed and then just show an AlertDialog with the specific information.

If you require rich styling, you may need to load the content from a server by utilizing a WebView. So for example your app's frontpage could partly consist of a WebView that in specific cases shows the news, which you intend to present to the user. Please note, that the WebView-technique is/was used by Facebook to update certain parts of their apps without the troubles of releasing a new version in the various App Stores.

Upvotes: 0

Bj&#246;rn Kechel
Bj&#246;rn Kechel

Reputation: 8463

All you need is to load an html, or better, a simple text file containing the notification index like:

in yourdomain.com/notificationnumber.txt contains "4"

Check in your applications, probably simply using SharedPreferences for the last displayed version. Then load all notification, for example:

yourdomain.com/notification3.html

yourdomain.com/notification4.html

Display them and store the index number to know which notifcations have been shown to the user. There are no special libraries needed for such a task.

Upvotes: 1

Jong
Jong

Reputation: 9125

If the announcements are not very frequent, then checking the html file on the server each time the application is launched is good enough.

Upvotes: 1

Related Questions