Category: Tutorial

Creating a Preference Activity in Android

The code below shows how to create a class that reads an XML preference definition, and turns it into a usable preferences screen. This functionality is built into Android, and whilst it does not cater for absolutely every case, for the majority of preferences, it should be a good starting point.

import android.os.Bundle;
import android.preference.PreferenceActivity;

 public class Preferences extends PreferenceActivity {
     @Override
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);  

         addPreferencesFromResource(R.xml.preferences);
     }
 }

Once you have this class, you will need to register it as an activity in AndroidManifest.xml

<activity android:name="Preferences"></activity>

is all that is required.

The next thing you need to do is to create an xml file under res/xml in the project. For the class above, it should be named preferences.xml, although if you change it in the java code above, you should use the same name for the actual file.

This actually permits having multiple xml preferences files, that can be called from different points in the application, whilst only having one class to handle both (or more cases).

The structure of the xml file is relatively straightforward, and I have provided a brief example below.

<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">

 <PreferenceCategory android:title="Category Name"

 android:summary="Brief summary of category">

 <ListPreference android:key="settingName" android:title="Main text for option"
 android:summary="sub title for option" android:entries="@array/someArrayForDisplayInList"
 android:entryValues="@array/anotherArrayForActualValues" android:dialogTitle="Name of the dialog that pops up" />

 <PreferenceScreen android:title="Main name of sub screen" android:summary="Summary of screen">

 <CheckBoxPreference android:key="settingName"
 android:title="Main Title of Preference"
 android:summary="A brief summary of the option/setting" />

 </PreferenceScreen>

 </PreferenceCategory>

</PreferenceScreen>

There is much more to the xml format than that, but you can see an example of the xml that is available at http://developer.android.com/resources/samples/ApiDemos/res/xml/preferences.html

The only remaining thing to do is to insert the following code where you want to show the preferences

startActivity(new Intent(this, Preferences.class));

Hopefully this can help someone who wants to quickly add preferences/settings to an app they are writing.

Links
The main API page for preferences @ android.com

How to create a simple BootReceiver in Android using BroadcastReceiver

The code below is an example of how to create a BroadcastReceiver class in Android that is notified when the system is booted. In addition to the code below, you’ll need to add the receiver to your AndroidManifest.xml file, as well as add the relevant permissions to the same file.

package <packageName>;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;

public class BootHelper extends BroadcastReceiver {

  @Override
  public void onReceive(Context context, Intent intent) {
    if(Intent.ACTION_BOOT_COMPLETED.equals(intent.getAction())) {
      // do your thing here
    }
  }
}

You’ll need to make the following changes to your manifest file in order to allow the broadcasted intent to reach you.

<receiver android:name=".BootHelper">
  <intent-filter>
  <action android:name="android.intent.action.BOOT_COMPLETED"></action>
  </intent-filter>
</receiver>

The above code needs to be put inside the <application> tag.

Finally, you will need to add the permission to receive the BOOT_COMPLETED intent when it is fired. The code below needs to be put inside the <manifest> tag, but outside of the <application> tag.

&lt;uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /&gt;

Now when you launch the application on an emulator, or a real phone, it should execute the code in the onReceive method. As this runs on boot you should probably keep the amount of processing to a minimum, in order to not slow the system down.

Note that you should only use this if it is necessary for your Application to do some processing when the OS is booted. For example, this is used in QuickTodo to ensure that overdue items continue to be notified, even when the device is rebooted.