0% found this document useful (0 votes)
86 views73 pages

Android Chapter11 Services Notifications

The document discusses Android services and notifications, explaining that services run in the background without interacting with the user, each service must be declared in the manifest, and services have lifecycle methods like onCreate(), onStart(), and onDestroy() to monitor state changes. It also covers broadcasting receivers, how they receive intents, and their onReceive() method, providing an example of how a main activity can start and stop a service that sends a broadcast.
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
86 views73 pages

Android Chapter11 Services Notifications

The document discusses Android services and notifications, explaining that services run in the background without interacting with the user, each service must be declared in the manifest, and services have lifecycle methods like onCreate(), onStart(), and onDestroy() to monitor state changes. It also covers broadcasting receivers, how they receive intents, and their onReceive() method, providing an example of how a main activity can start and stop a service that sends a broadcast.
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 73

Lesson 11

Services &
Notifications
Android
Services

Victor Matos
Cleveland State University

Notes are based on:


Android Developers
http://developer.android.com/index.html

Portions of this page are reproduced from work created and shared by Google and used according to terms
described in the Creative Commons 3.0 Attribution License.
Services
Android Services

A Service is an application component that runs in the background, not


interacting with the user, for an indefinite period of time.

Services, like other application objects (activitties, broadcast


listeners…), run in the main thread of their hosting process.

This means that, if your service is going to do any CPU intensive (such as MP3
playback) or blocking (such as networking) operations, it should spawn its own
thread in which to do that work.

Each service class must have a corresponding <service> declaration in its


package's AndroidManifest.xml.

Taken from: http://developer.android.com/guide/components/services.html 3


Services
Android Services

• Services can be started with: startService() and bindService().

• Each startService call invokes the onStart() method of the service class,
however the service is started only with the first call.

• Only one stopService() call is needed to stop the service, no matter how
many times startService() was called.

4
Taken from: http://developer.android.com/guide/components/services.html
Services
Service Life Cycle

Like an activity, a service has lifecycle


methods that you can implement to onCreate
monitor changes in its state. But they are
fewer than the activity methods — only
three — and they are public, not
protected:
onStart
1. void onCreate ()

2. void onStart (Intent intent)

3. void onDestroy () onDestroy

5
Services
Service Life Cycle

The entire lifetime of a service happens between the time onCreate() is called
and the time onDestroy() returns.

Like an activity, a service does its initial setup in onCreate(), and releases all
remaining resources in onDestroy().

For example, a music playback service could create the thread where the
music will be played in onCreate(), and then stop the thread in onDestroy().

6
Services
onStartCommand()

onStart() is deprecated from API level 5, onStartCommand() is the alternative.

public int onStartCommand(Intent intent, int flags,


int startId)

Input parameters:
intent - The Intent supplied to startService(Intent)
flags - Additional data about this start request
startId - A unique integer representing this specific request to start
Output result:
The return value indicates what semantics the system should use for the service's
current started state.
START_STICKY
START_NOT_STICKY
START_REDELIVER_INTENT
7
Services
Broadcast Receiver Lifecycle
A Broadcast Receiver is an application class that listens for global Intents that are
broadcasted to any one who bothers to listen, rather than being sent to a single target
application/activity.
The system delivers a broadcast Intent to all interested broadcast
receivers, which handle the Intent sequentially.

8
Services
Registering a Broadcast Receiver

• You can either dynamically register an instance of this class with


registerReceiver()

• or statically publish an implementation through the <receiver> tag in


your AndroidManifest.xml (see next example).

9
Services
Broadcast Receiver Lifecycle
onReceive
A broadcast receiver has a single callback method:

void onReceive (Context context, Intent broadcastMsg)

1. When a broadcast message arrives for the receiver, Android calls


its onReceive() method and passes it the Intent object containing the
message.

2. The broadcast receiver is considered to be active only while it is executing


its onReceive() method.

3. When onReceive() returns, it is inactive.

10
Services
Services, BroadcastReceivers and the AdroidManifest

The manifest of applications using Android Services must include:

1. A <service> entry for each service used in the application.

2. If the application defines a BroadcastReceiver as an independent class, it


must include a <receiver> clause identifying the component.
• In addition an <intent-filter> entry is needed to declare the actual
filter the service and the receiver use.

See example

11
Services
Services, BroadcastReceivers and the AdroidManifest
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="cis493.demos" android:versionCode="1" android:versionName="1.0.0">
<uses-sdk android:minSdkVersion="10" ></uses-sdk>

<application android:icon="@drawable/icon" android:label="@string/app_name">

<activity android:name=".MyServiceDriver2">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>

<service android:name="MyService2" />

<receiver android:name="MyBroadcastReceiver">
<intent-filter>
<action android:name = "matos.action.GOSERVICE2" />
</intent-filter>
</receiver>

</application>
</manifest>

12
Services
Types of Broadcasts

There are two major classes of broadcasts that can be received:

1. Normal broadcasts (sent with sendBroadcast) are completely


asynchronous. All receivers of the broadcast are run in an undefined
order, often at the same time.

2. Ordered broadcasts (sent with sendOrderedBroadcast) are delivered to


one receiver at a time. As each receiver executes in turn, it can
propagate a result to the next receiver, or it can completely abort the
broadcast (abortBroadcast())so that it won't be passed to other
receivers.
• Ordering receivers for execution can be controlled with the
android:priority attribute of the matching intent-filter;
• Receivers with the same priority will be run in an arbitrary order.
13
Services
Example: Main Steps – The Main Activity
Assume main activity MyService3Driver wants to interact with a service called
MyService3. The main activity is responsible for the following tasks:

1. Start the service called MyService3.


Intent intentMyService = new Intent(this, MyService3.class);
ComponentName service = startService(intentMyService);

2. Define corresponding receiver’s filter and register local receiver


IntentFilter mainFilter = new IntentFilter("matos.action.GOSERVICE3");
BroadcastReceiver receiver = new MyMainLocalReceiver();
registerReceiver(receiver, mainFilter);

3. Implement local receiver and override its main method


public void onReceive(Context localContext, Intent callerIntent)

14
Services
Example: Main Steps – The Service
The Service uses its onStart method to do the following:

1. Create an Intent with the appropriate broadcast filter (any number of


receivers could match it).

Intent myFilteredResponse = new Intent("matos.action.GOSERVICE3");

2. Prepare the extra data (‘myServiceData’) to be sent with the intent to the
receiver(s)

Object msg = some user data goes here;


myFilteredResponse.putExtra("myServiceData", msg);

3. Release the intent to all receivers matching the filter

sendBroadcast(myFilteredResponse);
15
Services
Example: Steps – The Driver (again)
The main activity is responsible for cleanly terminating the service. Do the
following

1. Assume intentMyService is the original Intent used to start the service.


Calling the termination of the service is accomplished by the method

stopService(new Intent(intentMyService) );

2. Use the service’s onDestroy method to assure that all of its running threads
are terminated and the receiver is unregistered.

unregisterReceiver(receiver);

16
Services
Example 1. A very Simple Service

The main application starts a service. The service prints lines on the LogCat
until the main activity stops the service. No IPC occurs in the example.
public class TestMyService1 extends Activity implements OnClickListener {
TextView txtMsg;
ComponentName service;
Intent intentMyService1;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
txtMsg = (TextView) findViewById(R.id.txtMsg);
findViewById(R.id.btnStopService).setOnClickListener(this);
intentMyService1 = new Intent(this, MyService1.class);
service = startService(intentMyService1);
txtMsg.setText("MyService1 started\n (see LogCat)");

}
17
Services
Example 1. A very Simple Service

The main application starts a service. The service prints lines on the LogCat
until the main activity stops the service. No IPC occurs in the example.

@Override
public void onClick(View v) {
// assume: v.getid == R.id.btnStopService
try {
stopService(intentMyService1);

txtMsg.setText("After stopping Service: \n" + service.getClassName());

} catch (Exception e) {
Toast.makeText(this, e.getMessage(), 1).show();
}

}//onClick

}//class

18
Services
Example 1. cont.
//non CPU intensive service running the main task in its main thread
package cis.matos;
import . . .
public class MyService1 extends Service {
@Override
public IBinder onBind(Intent arg0) {
return null;
}
@Override
public void onCreate() {
super.onCreate();
}
@Override
public void onStart(Intent intent, int startId) {
Log.e ("<<MyService1-onStart>>", "I am alive-1!");
Log.e ("<<MyService1-onStart>>", "I did something");
}

@Override
public void onDestroy() {
Log.e ("<<MyService1-onDestroy>>", "I am dead-1");
}
19
}//MyService1
Services
Example 1. cont.

According to the Log

1. Main Activity is started


2. Service is started (onCreate, onStart)
3. Main Activity UI is displayed
4. User stops Service
20
Services
Example 1. cont. Manifest
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="csu.matos"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="15" />
<application
android:icon="@drawable/ic_launcher" android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".TestMyService1"
android:label="@string/title_activity_test_service1" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<service android:name="MyService1" />
</application>
</manifest> 21
Services
Example 1. cont. Layout
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >

<EditText
android:id="@+id/txtMsg"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="none"
android:layout_margin="10dp" />

<Button
android:id="@+id/btnStopService"
android:layout_width="204dp"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text=" Stop Service1" />

</LinearLayout>
22
Services
Example 2. A More Interesting Activity-Service Interaction

1. The main activity starts the service and registers a receiver.

2. The service is slow, therefore it runs in a parallel thread its time


consuming task.

3. When done with a computing cycle, the service adds a message to an


intent.

4. The intent is broadcasted using the filter: matos.action.GOSERVICE3.

5. A BroadcastReceiver (defined inside the main Activity) uses the previous


filter and catches the message (displays the contents on the main UI ).

6. At some point the main activity stops the service and finishes executing.
23
Services
Example 2. Layout
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<Button
android:id="@+id/btnStopService"
android:layout_width="151dip"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="Stop Service" />
<ScrollView
android:layout_width="match_parent"
android:layout_height="wrap_content" >
<TextView
android:id="@+id/txtMsg"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="none" />
</ScrollView>
</LinearLayout> 24
Services
Example 2. Manifest
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="cis493.demos"
android:versionCode="1"
android:versionName="1.0.0" >

<uses-sdk android:minSdkVersion="10" >


</uses-sdk>

<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@android:style/Theme.Holo.Light">

<activity
android:name=".MyServiceDriver3"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />


</intent-filter>
</activity>

<service android:name="MyService3" >


</service>
</application>

</manifest> 25
Services
Example 2. Main Activity 1 of 3

public class MyServiceDriver3 extends Activity implements OnClickListener {


TextView txtMsg;
ComponentName service;
Intent intentMyService3;
BroadcastReceiver receiver;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
txtMsg = (TextView) findViewById(R.id.txtMsg);

intentMyService3 = new Intent(this, MyService3.class);


service = startService(intentMyService3);

txtMsg.setText("MyService3 started - (see LogCat)");


findViewById(R.id.btnStopService).setOnClickListener(this);

// register & define filter for local listener


IntentFilter mainFilter = new IntentFilter("matos.action.GOSERVICE3");
receiver = new MyMainLocalReceiver();
registerReceiver(receiver, mainFilter);

}//onCreate
26
Services
Example 2. Main Activity 2 of 3

public void onClick(View v) {


// assume: v.getId() == R.id.btnStopService
try {

stopService(intentMyService3);

txtMsg.setText("After stoping Service: \n" + service.getClassName() );


} catch (Exception e) {
e.printStackTrace();
}
}

@Override
protected void onDestroy() {
super.onDestroy();
try {
stopService(intentMyService3);
unregisterReceiver(receiver);

} catch (Exception e) {

Log.e ("MAIN3-DESTROY>>>", e.getMessage() );


}
Log.e ("MAIN3-DESTROY>>>" , "Adios" );
}
27
Services
Example 2. Main Activity 3 of 3

public class MyMainLocalReceiver extends BroadcastReceiver {


@Override
public void onReceive(Context localContext, Intent callerIntent) {

String serviceData = callerIntent.getStringExtra("service3Data");


Log.e ("MAIN>>>", "Data received from Service3: " + serviceData);
String now = "\nService3Data: > " + serviceData;
txtMsg.append(now);
}

}//MyMainLocalReceiver

}//MyServiceDriver3

28
Services
Example 2. Service 1 of 2

public class MyService3 extends Service {


boolean isRunning = true;

@Override
public IBinder onBind(Intent arg0) {
return null;
}

@Override
public void onCreate() {
super.onCreate();
}

@Override
public void onStart(Intent intent, int startId) {
Log.e ("<<MyService3-onStart>>", "I am alive-3!");

Thread serviceThread = new Thread ( new Runnable(){


public void run() {
for(int i=0; (i< 120) & isRunning; i++) {
try {
//fake that you are very busy here
Thread.sleep(1000);
Intent intentDataForMyClient = new Intent("matos.action.GOSERVICE3");
String msg = "data-item-" + i;
29
Services
Example 2. Service 2 of 2

intentDataForMyClient.putExtra("service3Data", msg);
sendBroadcast(intentDataForMyClient);

} catch (Exception e) {
e.printStackTrace();
}
}//for

}//run

});
serviceThread.start();

}//onStart

@Override
public void onDestroy() {
super.onDestroy();
Log.e ("<<MyService3-onDestroy>>", "I am Dead-3");
isRunning = false;
}//onDestroy

}//MyService3
30
Services
Example 3. An App Connected to Multiple Services
Main App
TestMyService4
(Manages UI)

Broadcast Listener

MyService4
(Music Player)

MyService5Async
(Fibonacci Number Generator)

MyService6
(GPS Coordinates)
31
Services
Example 3. An App Connected to Multiple Services

In this applicatiopn the Main Activity starts three services:

1. MyService4: A music player whose input is an mp3 resource file stored


in res/raw.
2. MyService5Async: A service producing Fibonacci numbers in the 20-50
range. The task of number generation is implemented inside an
AsyncTask. The efficiency of this Fibonacci implementation is O(2n)
[intentionally slow!]
3. MyService6: The service returns GPS coordinates. Two methods are
used to obtain the current location (a) a quick Network-provider based
reading (coarse location) , and (b) a more precise but slower Satellite
reading (fine location).

The Main Application defines and registers a BroadcastReceiver capable of


attending messages matching any of the three filters used by the
broadcasting services above. Received results are displayed on the user’s
screen.
32
Services
Example 3. An App Connected to Multiple Services

33
Services
Example 3. MainActivity: TestMyService4.java
package csu.matos;
import . . .

public class TestService4 extends Activity implements OnClickListener {


TextView txtMsg;
Intent intentCallService4;
Intent intentCallService5;
Intent intentCallService6;
BroadcastReceiver receiver;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
txtMsg = (TextView) findViewById(R.id.txtMsg);

findViewById(R.id.btnStart4).setOnClickListener(this);
findViewById(R.id.btnStop4).setOnClickListener(this);

findViewById(R.id.btnStart5).setOnClickListener(this);
findViewById(R.id.btnStop5).setOnClickListener(this);

findViewById(R.id.btnStart6).setOnClickListener(this);
findViewById(R.id.btnStop6).setOnClickListener(this);
34
Services
Example 3. MainActivity: TestMyService4.java

Log.e("MAIN", "Main started");

// get ready to invoke execution of background services


intentCallService4 = new Intent(this, MyService4.class);
intentCallService5 = new Intent(this, MyService5Async.class);
intentCallService6 = new Intent(this, MyService6.class);

// register local listener & define triggering filter


IntentFilter filter5 = new IntentFilter("matos.action.GOSERVICE5");
IntentFilter filter6 = new IntentFilter("matos.action.GPSFIX");

receiver = new MyEmbeddedBroadcastReceiver();


registerReceiver(receiver, filter5);
registerReceiver(receiver, filter6);

}// onCreate

35
Services
Example 3. MainActivity: TestMyService4.java

@Override
public void onClick(View v) {

if (v.getId() == R.id.btnStart4) {
Log.e("MAIN", "onClick: starting service4");
startService(intentCallService4);
} else if (v.getId() == R.id.btnStop4) {
Log.e("MAIN", "onClick: stopping service4");
stopService(intentCallService4);
} else if (v.getId() == R.id.btnStart5) {
Log.e("MAIN", "onClick: starting service5");
startService(intentCallService5);
} else if (v.getId() == R.id.btnStop5) {
Log.e("MAIN", "onClick: stopping service5");
stopService(intentCallService5);
} else if (v.getId() == R.id.btnStart6) {
Log.e("MAIN", "onClick: starting service6");
startService(intentCallService6);
} else if (v.getId() == R.id.btnStop6) {
Log.e("MAIN", "onClick: stopping service6");
stopService(intentCallService6);
}
}// onClick
36
Services
Example 3. MainActivity: TestMyService4.java
public class MyEmbeddedBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Log.e("MAIN>>>", "ACTION: " + intent.getAction());

if (intent.getAction().equals("matos.action.GOSERVICE5")) {
String service5Data = intent.getStringExtra("MyService5DataItem");
Log.e("MAIN>>>", "Data received from Service5: " + service5Data);
txtMsg.append("\nService5Data: > " + service5Data);

} else if (intent.getAction().equals("matos.action.GPSFIX")) {
double latitude = intent.getDoubleExtra("latitude", -1);
double longitude = intent.getDoubleExtra("longitude", -1);
String provider = intent.getStringExtra("provider");
String service6Data = provider
+ " lat: " + Double.toString(latitude)
+ " lon: " + Double.toString(longitude);
Log.e("MAIN>>>", "Data received from Service6: " + service6Data);
txtMsg.append("\nService6Data: > " + service6Data);
}

}//onReceive
}// MyEmbeddedBroadcastReceiver
}// TestService4 class
37
Services
Example 3. MyService4 – A Music Player
package csu.matos;
import . . .

public class MyService4 extends Service {


public static boolean boolIsServiceCreated = false;
MediaPlayer player;

@Override
public IBinder onBind(Intent intent) {
return null;
}

@Override
public void onCreate() {
Toast.makeText(this, "MyService4 Created", Toast.LENGTH_LONG).show();
Log.e("MyService4", "onCreate");

boolIsServiceCreated = true;
player = MediaPlayer.create(getApplicationContext(),
R.raw.good_bad_ugly);
}

38
Services
Example 3. MyService4 – A Music Player

@Override
public void onDestroy() {
Toast.makeText(this, "MyService4 Stopped", Toast.LENGTH_LONG).show();
Log.e("MyService4", "onDestroy");
player.stop();
player.release();
player = null;
}

@Override
public void onStart(Intent intent, int startid) {
if (player.isPlaying())
Toast.makeText(this, "MyService4 Already Started " + startid,
Toast.LENGTH_LONG).show();
else
Toast.makeText(this, "MyService4 Started " + startid,
Toast.LENGTH_LONG).show();

Log.e("MyService4", "onStart");
player.start();
}
}

39
Services
Example 3. MyService5Async – A Slow Fibonacci Number Gen.
package csu.matos;
import . . .

public class MyService5Async extends Service {


boolean isRunning = true;

private Handler handler = new Handler() {


@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
Log.e("MyService5Async-Handler", "Handler got from MyService5Async: "
+ (String)msg.obj);
}
};

@Override
public IBinder onBind(Intent arg0) {
return null;
}

@Override
public void onCreate() {
super.onCreate();
}
40
Services
Example 3. MyService5Async – A Slow Fibonacci Number Gen.
@Override
public void onStart(Intent intent, int startId) {
Log.e ("<<MyService5Async-onStart>>", "I am alive-5Async!");
// we place the slow work of the service in an AsynTask
// so the response we send our caller who run
// a "startService(...)" method gets a quick OK from us.

new ComputeFibonacciRecursivelyTask().execute(20, 50);


}//onStart

// this recursive evaluation of Fibonacci numbers is exponential O(2^n)


// for large n values it should be very time-consuming!
public Integer fibonacci(Integer n){
if ( n==0 || n==1 )
return 1;
else
return fibonacci(n-1) + fibonacci(n-2);
}

@Override
public void onDestroy() {
//super.onDestroy();
Log.e ("<<MyService5Async-onDestroy>>", "I am dead-5-Async");
isRunning = false;
}//onDestroy 41
Services
Example 3. MyService5Async – A Slow Fibonacci Number Gen.
public class ComputeFibonacciRecursivelyTask extends AsyncTask <
Integer, Integer, Integer > {
@Override
protected Integer doInBackground(Integer... params) {
for (int i=params[0]; i<params[1]; i++){
Integer fibn = fibonacci(i);
publishProgress(i, fibn);
}
return null;
}

@Override
protected void onProgressUpdate(Integer... values) {
super.onProgressUpdate(values);
Intent intentFilter5 = new Intent("matos.action.GOSERVICE5");
String data = "dataItem-5-fibonacci-AsyncTask"
+ values[0] + ": " + values[1];
intentFilter5.putExtra("MyService5DataItem", data);
sendBroadcast(intentFilter5);
// (next id not really needed!!! - we did the broadcasting already)
Message msg = handler.obtainMessage(5, data);
handler.sendMessage(msg);
}
}// ComputeFibonacciRecursivelyTask
}//MyService5 42
Services
Example 3. MyService6 – A GPS Service broadcasting locations.
package csu.matos;
Import . . .

public class MyService6 extends Service {

String GPS_FILTER = "matos.action.GPSFIX";

Thread serviceThread;
LocationManager lm;
GPSListener myLocationListener;

@Override
public IBinder onBind(Intent arg0) {
return null;
}

@Override
public void onCreate() {
super.onCreate();
}

43
Services
Example 3. MyService6 – A GPS Service broadcasting locations.
@Override
public void onStart(Intent intent, int startId) {
Log.e("<<MyGpsService-onStart>>", "I am alive-GPS!");

serviceThread = new Thread(new Runnable() {


public void run() {

getGPSFix_Version1(); // uses NETWORK provider

getGPSFix_Version2(); // uses GPS chip provider

}// run

});

serviceThread.start();

}// onStart

44
Services
Example 3. MyService6 – A GPS Service broadcasting locations.
public void getGPSFix_Version1() {

// Get the location manager


LocationManager locationManager = (LocationManager)
getSystemService(Context.LOCATION_SERVICE);
// work with best provider
Criteria criteria = new Criteria();
String provider = locationManager.getBestProvider(criteria, false);
Location location = locationManager.getLastKnownLocation(provider);
if ( location != null ){
// capture location data sent by current provider
double latitude = location.getLatitude();
double longitude = location.getLongitude();

// assemble data bundle to be broadcasted


Intent myFilteredResponse = new Intent(GPS_FILTER);
myFilteredResponse.putExtra("latitude", latitude);
myFilteredResponse.putExtra("longitude", longitude);
myFilteredResponse.putExtra("provider", provider);
Log.e(">>GPS_Service<<", provider + " =>Lat:" + latitude
+ " lon:" + longitude);
// send the location data out
sendBroadcast(myFilteredResponse);
}
} 45
Services
Example 3. MyService6 – A GPS Service broadcasting locations.
public void getGPSFix_Version2() {
try {
Looper.prepare();
// try to get your GPS location using the
// LOCATION.SERVIVE provider
lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);

// This listener will catch and disseminate location updates


myLocationListener = new GPSListener();
// define update frequency for GPS readings
long minTime = 2000; // 2 seconds
float minDistance = 5; // 5 meter
// request GPS updates
lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, minTime,
minDistance, myLocationListener);
Looper.loop();

} catch (Exception e) {
e.printStackTrace();
}

46
Services
Example 3. MyService6 – A GPS Service broadcasting locations.

@Override
public void onDestroy() {
super.onDestroy();
Log.e("<<MyGpsService-onDestroy>>", "I am dead-GPS");
try {
lm.removeUpdates(myLocationListener);
isRunning = false;
} catch (Exception e) {
Toast.makeText(getApplicationContext(), e.getMessage(), 1).show();
}
}// onDestroy

47
Services
Example 3. MyService6 – A GPS Service broadcasting locations.
private class GPSListener implements LocationListener {
public void onLocationChanged(Location location) {
// capture location data sent by current provider
double latitude = location.getLatitude();
double longitude = location.getLongitude();
// assemble data bundle to be broadcasted
Intent myFilteredResponse = new Intent(GPS_FILTER);
myFilteredResponse.putExtra("latitude", latitude);
myFilteredResponse.putExtra("longitude", longitude);
myFilteredResponse.putExtra("provider", location.getProvider());
Log.e(">>GPS_Service<<", "Lat:" + latitude + " lon:" + longitude);
// send the location data out
sendBroadcast(myFilteredResponse);
}

public void onProviderDisabled(String provider) {


}

public void onProviderEnabled(String provider) {


}

public void onStatusChanged(String provider, int status, Bundle extras) {


}
};// GPSListener class
}// MyService3 48
Services
Example 3. Manifest
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="csu.matos" android:versionCode="1" android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8" android:targetSdkVersion="15" />

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />


<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name" android:theme="@style/AppTheme" >
<activity
android:name=".TestService4"
android:label="@string/title_activity_test_service4"
android:screenOrientation="portrait">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<service android:name=".MyService4"/>
<service android:name=".MyService5Async" />
<service android:name=".MyService6" />
</application>
</manifest> 49
Services
Example 3. Layout
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent" >

<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >

<Button
android:id="@+id/btnStart4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ems="15"
android:text="Start Service4 (Music Player)" />

<Button
android:id="@+id/btnStop4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ems="15"
android:text="Stop Service4 (Music Player)" /> 50
Services
Example 3. Layout
<Button
android:id="@+id/btnStart5"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ems="15"
android:text="Start Service5 (Fibonacci)" />
<Button
android:id="@+id/btnStop5"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ems="15"
android:text="Stop Service5 (Fibonacci)" />
<Button
android:id="@+id/btnStart6"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ems="15"
android:text="Start Service6 (GPS Fix)" />
<Button
android:id="@+id/btnStop6"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ems="15"
android:text="Stop Service6 (GPS Fix)" /> 51
Services
Example 3. Layout

<ScrollView
android:layout_width="match_parent"
android:layout_height="wrap_content" >

<TextView
android:id="@+id/txtMsg"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="5dp" />

</ScrollView>

</LinearLayout>

</LinearLayout>

52
Android
Notifications

Victor Matos
Cleveland State University

Notes are based on:


Android Developers
http://developer.android.com/index.html

Portions of this page are reproduced from work created and shared by Google and used according to terms
described in the Creative Commons 3.0 Attribution License.
Notifications
What is a Notification?

A notification is a short message briefly displayed on the status line.

It typically announces the happening of an special event for which a


trigger has been set.

After opening the Notification Panel the user may choose to click on a
selection and execute an associated activity.

54
Notifications
What is a Notification?
Notification shown
on the status line

Drag down

Click on
Notification
Panel to
execute
associated
application

55
Notifications
Notification Manager
This class notifies the user of events that happen in the background.

Notifications can take different forms:

1. A persistent icon that goes in the status bar and is accessible through the
launcher, (when the user selects it, a designated Intent can be launched),

2. Turning on or flashing LEDs on the device, or

3. Alerting the user by flashing the backlight, playing a sound, or vibrating.

56
Notifications – Since Jelly Bean 4.0
Base Layout

All notifications include in their MINIMUM configurations three parts:


1. the sending application's notification icon or the sender's photo a
notification title and message
2. a timestamp
3. a secondary icon to identify the sending application when the senders
image is shown for the main icon

Optional Entries
1. Additional lines
2. Up to three actions
3. A summary line

57
Notifications – Since Jelly Bean 4.0
Extended Layout

Sender’s
Icon / Photo

Extra lines

Up to 3
Actions to
call

Summary

Activity to
be called

58
Notifications
Notification Manager

You do not instantiate this class directly; instead, retrieve it through


getSystemService ( String ).

Example:

String servName = Context.NOTIFICATION_SERVICE;

notificationManager = (NotificationManager)
getSystemService (servName);

59
Notifications
Notification Builder
A convenient way to set up various fields of a Notification
Example:

Notification noti = new Notification.Builder(Context)


.setContentTitle(“Important message for you...”)
.setContentText(subject)
.setSmallIcon(R.drawable.new_mail)
.setLargeIcon(aBitmap)
.build();

60
Notifications
Example

61
Notifications
Example

62
Notifications
Example

63
Notifications
Example: MainActivity
package com.example.mynotificationmanager;
import . . .

public class MainActivity extends Activity implements OnClickListener {


NotificationManager notificationManager;
final int NOTIFICATION_ID = 12345;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

setContentView(R.layout.main);
findViewById(R.id.btnBig).setOnClickListener(this);
findViewById(R.id.btnCancel).setOnClickListener(this);

}// onCreate

@SuppressLint("NewApi")
public void createBigNotification(View view) {

Intent intent = new Intent(this, NotificationReceiverActivity.class);


intent.putExtra("callerIntent", "main");
intent.putExtra("notificationID", NOTIFICATION_ID);
PendingIntent pIntent = PendingIntent.getActivity(this, 0, intent, 0);
64
Notifications
Example: MainActivity
// better way to do previous work
PendingIntent pIntent1 = makePendingIntent(
NotificationReceiverActivity1.class, "Action1");
PendingIntent pIntent2 = makePendingIntent(
NotificationReceiverActivity2.class, "Action2");
PendingIntent pIntent3 = makePendingIntent(
NotificationReceiverActivity3.class, "Action3");

// a bitmap to be added in the notification view


Bitmap myBitmap = BitmapFactory.decodeResource(getResources(),
R.drawable.my_large_bitmap);

Notification.Builder baseNotification = new Notification.Builder(this)


.setContentTitle("TITLE goes here ...")
.setContentText("Second Line of text goes here")
.addAction(R.drawable.icon1, "Action1", pIntent1)
.addAction(R.drawable.icon2, "Action2", pIntent2)
.addAction(R.drawable.icon3, "Action3", pIntent3)
.setSmallIcon(R.drawable.icon0)
.setLargeIcon(myBitmap)
.setContentIntent(pIntent) ;

65
Notifications
Example: MainActivity
Notification noti = new Notification.InboxStyle(baseNotification)
.addLine("Line-1")
.addLine("Line-2")
.addLine("Line-2")
.setSummaryText("SUMMARY-Line-1 here")
.build();

notificationManager = (NotificationManager)
getSystemService(NOTIFICATION_SERVICE);
// Hide the notification after its selected
noti.flags |= Notification.FLAG_AUTO_CANCEL;
// notification ID is 12345
notificationManager.notify(12345, noti);

}// createBigNotification

@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btnBig:
createBigNotification(v);
break;

66
Notifications
Example: MainActivity
case R.id.btnCancel :
try {
if ( notificationManager != null){
notificationManager.cancel(NOTIFICATION_ID);
}
} catch (Exception e) {
Log.e("<<MAIN>>", e.getMessage() );
}
break;

}
}// onClick

public PendingIntent makePendingIntent(Class partnerClass, String callerName)


{
Intent intent = new Intent(this, partnerClass);
intent.putExtra("callerIntent", callerName);
intent.putExtra("notificationID", NOTIFICATION_ID);
PendingIntent pIntent = PendingIntent.getActivity(this, 0, intent, 0);
return pIntent;
}

}// class
67
Notifications
Example: NotificationReceiverActivity

package com.example.mynotificationmanager;

import . . .

public class NotificationReceiverActivity extends Activity {


@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.result);

String callerName = getIntent()


.getStringExtra("callerIntent");

Toast.makeText(this, "Called by: " + callerName, 1).show();


}
}

68
Notifications
Example: Manifest
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.mynotificationmanager"
android:versionCode="1"
android:versionName="1.0" >

<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="14" />

<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" ><activity
android:name=".MainActivity"
android:label="@string/title_activity_main" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />


</intent-filter>
</activity>
<activity android:name=".NotificationReceiverActivity"
android:icon="@drawable/icon0" >
</activity>
69
Notifications
Example: Manifest
<activity android:name=".NotificationReceiverActivity1"
android:icon="@drawable/icon1" >
</activity>

<activity android:name=".NotificationReceiverActivity2"
android:icon="@drawable/icon2" >
</activity>

<activity android:name=".NotificationReceiverActivity3"
android:icon="@drawable/icon3" >
</activity>

</application>

</manifest>

70
Notifications
Example - Layout: main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >

<Button
android:id="@+id/btnBig"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Create Big Notification"
android:ems="20" >
</Button>

<Button
android:id="@+id/btnCancel"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Cancel Notification"
android:ems="20" >
</Button>

</LinearLayout>
71
Notifications
Example - Layout: main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >

<TextView
android:id="@+id/txtMsg"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Called from the MASTER notification" >
</TextView>

</LinearLayout>

72
Notifications
Use custom view
// Define remote views from custom design xml
RemoteViews contentView = new RemoteViews(getPackageName(),
R.layout.notification_content_view);

// Set onOnClickPendingIntent
contentView.setOnClickPendingIntent(R.id.button_play, pendingIntent);

// Set contentView of notification


Notification notification = builder.build();
notification.contentView = contentView;

73

You might also like