Take the 2-minute tour ×

I need to retrieve some text from a RemoteViews object. It is possible for me to get the LayoutId, but I have no idea how to retrieve text from a TextView that is in this RemoteView (namely a notification).

Also the RemoteView only contains setters, but no getters, so I guess I have to use the LayoutId (somehow).

Can you help me with that? Thanks!

/edit: The reason why I am asking this, is because I have an AccessibilityService that retrieves the notification. Therefore this is the only way of retrieving the value.

/edit2: I use this code for receiving the notification:

public void onAccessibilityEvent(AccessibilityEvent event) {
    if (event.getEventType() == AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED) {
        List<CharSequence> notificationList = event.getText();
        for (int i = 0; i < notificationList.size(); i++) {
            Toast.makeText(this.getApplicationContext(), notificationList.get(i), 1).show();
        if (!(parcel instanceof Notification)) {
        final Notification notification = (Notification) parcel;


With the notification object I have access to a RemoteViews (notification.contentView) and to a PendingIntent (notification.contentIntent). To get the layoutId, I can call contentView.getLayoutId()

share|improve this question
It would probably be better to save the information somewhere (SharedPreferences, etc), and then have both the RemoteViews and your other code access the information from there. –  Paul Grime Feb 15 '12 at 13:05
Well, I am using a AccessibilityService for retrieving the notification, so I cannot simply store the value somewhere, because my application did not create the notification ;-) –  Force Feb 15 '12 at 14:19
How do you get the layout id? Can you post the code that receives the notifcation? –  Paul Grime Feb 15 '12 at 14:35
Sure - see the updated question. –  Force Feb 15 '12 at 15:03
Hmm, not sure you can. I thought that maybe the Notification would contain a reference to the Intent that caused it (and its data), but it doesn't seem to. Don't think you can retrieve the data from the RemoteViews object. –  Paul Grime Feb 15 '12 at 16:50
add comment

3 Answers

I proposed a similar solution here that also uses reflection to solve the problem, but in a more approachable fashion. This is my solution. In this context, the RemoteViews came from a Notification, so the first three lines can probably be ignored if you already have access to the RemoteViews object. The link on the page provides a much more detailed explanation of what is actually going on. I hope this will help anyone with a similar problem.

public static List<String> getText(Notification notification)
    // We have to extract the information from the view
    RemoteViews        views = notification.bigContentView;
    if (views == null) views = notification.contentView;
    if (views == null) return null;

    // Use reflection to examine the m_actions member of the given RemoteViews object.
    // It's not pretty, but it works.
    List<String> text = new ArrayList<String>();
        Field field = views.getClass().getDeclaredField("mActions");

        ArrayList<Parcelable> actions = (ArrayList<Parcelable>) field.get(views);

        // Find the setText() and setTime() reflection actions
        for (Parcelable p : actions)
            Parcel parcel = Parcel.obtain();
            p.writeToParcel(parcel, 0);

            // The tag tells which type of action it is (2 is ReflectionAction, from the source)
            int tag = parcel.readInt();
            if (tag != 2) continue;

            // View ID

            String methodName = parcel.readString();
            if (methodName == null) continue;

            // Save strings
            else if (methodName.equals("setText"))
                // Parameter type (10 = Character Sequence)

                // Store the actual string
                String t = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(parcel).toString().trim();

            // Save times. Comment this section out if the notification time isn't important
            else if (methodName.equals("setTime"))
                // Parameter type (5 = Long)

                String t = new SimpleDateFormat("h:mm a").format(new Date(parcel.readLong()));


    // It's not usually good style to do this, but then again, neither is the use of reflection...
    catch (Exception e)
        Log.e("NotificationClassifier", e.toString());

    return text;
share|improve this answer
add comment
up vote 4 down vote accepted

Taken from Extract notification text from parcelable, contentView or contentIntent :

Notification notification = (Notification) event.getParcelableData();
RemoteViews views = notification.contentView;
Class secretClass = views.getClass();

try {
    Map<Integer, String> text = new HashMap<Integer, String>();

    Field outerFields[] = secretClass.getDeclaredFields();
    for (int i = 0; i < outerFields.length; i++) {
        if (!outerFields[i].getName().equals("mActions")) continue;


        ArrayList<Object> actions = (ArrayList<Object>) outerFields[i]
        for (Object action : actions) {
            Field innerFields[] = action.getClass().getDeclaredFields();

            Object value = null;
            Integer type = null;
            Integer viewId = null;
            for (Field field : innerFields) {
                if (field.getName().equals("value")) {
                    value = field.get(action);
                } else if (field.getName().equals("type")) {
                    type = field.getInt(action);
                } else if (field.getName().equals("viewId")) {
                    viewId = field.getInt(action);

            if (type == 9 || type == 10) {
                text.put(viewId, value.toString());

        System.out.println("title is: " + text.get(16908310));
        System.out.println("info is: " + text.get(16909082));
        System.out.println("text is: " + text.get(16908358));
} catch (Exception e) {
share|improve this answer
add comment

CommonsWare in this question says:

... App widgets are write-only: you can push data to them, but you cannot read them. Instead, when you update your app widget with new text, you will need to store that text somewhere, perhaps in a file.

His answer seems to be logical.

share|improve this answer
add comment

Your Answer


