Implementing an application service that will run in response to an alarm, allowing us to move long duration work out of an intent receiver. : Intent « Core Class « Android






Implementing an application service that will run in response to an alarm, allowing us to move long duration work out of an intent receiver.

    
/*
 * Copyright (C) 2007 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package app.test;

import android.app.Activity;
import android.app.AlarmManager;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.Bundle;
import android.os.IBinder;
import android.os.Parcel;
import android.os.RemoteException;
import android.os.SystemClock;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;

/**
 * This is an example of implementing an application service that will run in
 * response to an alarm, allowing us to move long duration work out of an intent
 * receiver.
 * 
 * @see AlarmService
 * @see AlarmService_Alarm
 */
class AlarmService_Service extends Service {
  NotificationManager mNM;

  @Override
  public void onCreate() {
    mNM = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);

    // show the icon in the status bar
    showNotification();

    // Start up the thread running the service. Note that we create a
    // separate thread because the service normally runs in the process's
    // main thread, which we don't want to block.
    Thread thr = new Thread(null, mTask, "AlarmService_Service");
    thr.start();
  }

  @Override
  public void onDestroy() {
    // Cancel the notification -- we use the same ID that we had used to
    // start it
    mNM.cancel(0);

    // Tell the user we stopped.
    Toast.makeText(this, "alarm_service_finished",
        Toast.LENGTH_SHORT).show();
  }

  /**
   * The function that runs in our worker thread
   */
  Runnable mTask = new Runnable() {
    public void run() {
      // Normally we would do some work here... for our sample, we will
      // just sleep for 30 seconds.
      long endTime = System.currentTimeMillis() + 15 * 1000;
      while (System.currentTimeMillis() < endTime) {
        synchronized (mBinder) {
          try {
            mBinder.wait(endTime - System.currentTimeMillis());
          } catch (Exception e) {
          }
        }
      }

      // Done with our work... stop the service!
      AlarmService_Service.this.stopSelf();
    }
  };

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

  /**
   * Show a notification while this service is running.
   */
  private void showNotification() {
    // In this sample, we'll use the same text for the ticker and the
    // expanded notification
    CharSequence text = "alarm_service_started";

    // Set the icon, scrolling text and timestamp
    Notification notification = new Notification(R.drawable.icon,
        text, System.currentTimeMillis());

    // The PendingIntent to launch our activity if the user selects this
    // notification
    PendingIntent contentIntent = PendingIntent.getActivity(this, 0,
        new Intent(this, Test.class), 0);

    // Set the info for the views that show in the notification panel.
    notification.setLatestEventInfo(this,
        "alarm_service_label", text, contentIntent);

    // Send the notification.
    // We use a layout id because it is a unique number. We use it later to
    // cancel.
    mNM.notify(0, notification);
  }

  /**
   * This is the object that receives interactions from clients. See
   * RemoteService for a more complete example.
   */
  private final IBinder mBinder = new Binder() {
    @Override
    protected boolean onTransact(int code, Parcel data, Parcel reply,
        int flags) throws RemoteException {
      return super.onTransact(code, data, reply, flags);
    }
  };
}

/**
 * This demonstrates how you can schedule an alarm that causes a service to be
 * started. This is useful when you want to schedule alarms that initiate
 * long-running operations, such as retrieving recent e-mails.
 */
public class Test extends Activity {
  private PendingIntent mAlarmSender;

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

    // Create an IntentSender that will launch our service, to be scheduled
    // with the alarm manager.
    mAlarmSender = PendingIntent.getService(Test.this, 0, new Intent(
        Test.this, AlarmService_Service.class), 0);

    setContentView(R.layout.main);

    // Watch for button clicks.
    Button button = (Button) findViewById(R.id.start_alarm);
    button.setOnClickListener(mStartAlarmListener);
    button = (Button) findViewById(R.id.stop_alarm);
    button.setOnClickListener(mStopAlarmListener);
  }

  private OnClickListener mStartAlarmListener = new OnClickListener() {
    public void onClick(View v) {
      // We want the alarm to go off 30 seconds from now.
      long firstTime = SystemClock.elapsedRealtime();

      // Schedule the alarm!
      AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);
      am.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, firstTime,
          30 * 1000, mAlarmSender);

      // Tell the user about what we did.
      Toast.makeText(Test.this, "repeating_scheduled", Toast.LENGTH_LONG)
          .show();
    }
  };

  private OnClickListener mStopAlarmListener = new OnClickListener() {
    public void onClick(View v) {
      // And cancel the alarm.
      AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);
      am.cancel(mAlarmSender);

      // Tell the user about what we did.
      Toast.makeText(Test.this, "repeating_unscheduled",
          Toast.LENGTH_LONG).show();

    }
  };
}

//main.xml

<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2007 The Android Open Source Project

     Licensed under the Apache License, Version 2.0 (the "License");
     you may not use this file except in compliance with the License.
     You may obtain a copy of the License at
  
          http://www.apache.org/licenses/LICENSE-2.0
  
     Unless required by applicable law or agreed to in writing, software
     distributed under the License is distributed on an "AS IS" BASIS,
     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     See the License for the specific language governing permissions and
     limitations under the License.
-->

<!-- Demonstrates starting and stopping a local service.
     See corresponding Java code com.android.sdk.app.LocalSerice.java. -->

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

    <TextView
        android:layout_width="match_parent" android:layout_height="wrap_content"
        android:layout_weight="0"
        android:paddingBottom="4dip"
        android:text="alarm_service"/>

    <Button android:id="@+id/start_alarm"
        android:layout_width="wrap_content" android:layout_height="wrap_content" 
        android:text="start_alarm_service">
        <requestFocus />
    </Button>

    <Button android:id="@+id/stop_alarm"
        android:layout_width="wrap_content" android:layout_height="wrap_content" 
        android:text="stop_alarm_service" />

</LinearLayout>

   
    
    
    
  








Related examples in the same category

1.Using Intent to open other Activity
2.Create Intent to open a Uri
3.extends IntentService
4.Phone Intent
5.Map Intent
6.Market Intent
7.Load Activity with Intent
8.Using Intent to make another phone call
9.extends IntentService to create your own Intent
10.Adding data bundle to Intent
11.Using Intent to show other Activities
12.Start Intent with Utility class
13.Load library Activity with Intent
14.Capture Image with Intent
15.Intent.ACTION_MEDIA_MOUNTED
16.Using Intent to record audio
17.Video Player Intent
18.Video Capture Intent
19.Example of various Intent flags to modify the activity stack.
20.Sample code that invokes the speech recognition intent API.
21.extends IntentService to upload a file
22.factory class for generating various intents
23.Open Web Page Intent
24.Is Intent Available
25.start MMS Intent
26.Access the Internet
27.Pdf viewer
28.Rotation One Demo
29.Media activity