实现这个实例需要的就是Service这个类的管理,我们用到的是启动Service,并在退出应用程序的时候关闭(Stop)Service,下面我们首先看下这个程序的运行截图:
图中显示的控件一个是ImageView,另一个是ImageButton,我们点击ImageButton之后可以控制程序的运行和关闭,这里我们看到的是关闭的状态。
当我们点击ImageButton之后,程序开始运行,并且在通知栏有相应的显示。
下面给出实现的截图:
下面给出实现的代码:
1.Service类
package irdc.ex10_08;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.media.MediaPlayer;
import android.os.IBinder;
/* 自定义MyService继承Service */
public class MyService extends Service
{
private String MY_PREFS = "MosPre";
private NotificationManager notiManager;
private int mosStatus;
private int notiId=99;
private MediaPlayer myPlayer;
@Override
public void onCreate()
{
try
{
/* 取得NotificationManager */
notiManager=
(NotificationManager)getSystemService(NOTIFICATION_SERVICE);
/* Create MediaPlayer */
myPlayer=new MediaPlayer();
myPlayer = MediaPlayer.create(MyService.this, R.raw.killmosall);
/* 读取防蚊服务状态(1:启动,0:关闭) */
SharedPreferences pres =
getSharedPreferences(MY_PREFS,Context.MODE_PRIVATE);
if(pres !=null)
{
mosStatus = pres.getInt("status", 0);
}
if(mosStatus==1)
{
/* 加一个Notification */
setNoti(R.drawable.antimos,notiId,"防蚊服务启动");
/* 播放防蚊铃声 */
if(!myPlayer.isPlaying())
{
myPlayer.seekTo(0);
myPlayer.setLooping(true);
myPlayer.start();
}
}
else if(mosStatus==0)
{
/* 删除Notification */
deleteNoti(notiId);
/* 关闭防蚊铃声 */
if(myPlayer.isPlaying())
{
myPlayer.setLooping(false);
myPlayer.pause();
}
}
}
catch (Exception e)
{
e.printStackTrace();
}
super.onCreate();
}
@Override
public void onDestroy()
{
try
{
/* Service关闭时释放MediaPlayer,
* 并删除Notification */
myPlayer.release();
deleteNoti(notiId);
}
catch(Exception e)
{
e.printStackTrace();
}
super.onDestroy();
}
/* 新增Notification的method */
public void setNoti(int iconImg,int iconId,String icontext)
{
/* 建立点选Notification留言条时,会执行的Activity */
Intent notifyIntent=new Intent(this,EX10_08.class);
notifyIntent.setFlags( Intent.FLAG_ACTIVITY_NEW_TASK);
/* 建立PendingIntent当为设定递延执行的Activity */
PendingIntent appIntent=PendingIntent.getActivity(this,0,notifyIntent,0);
/* 建立Notification,并设定相关参数 */
Notification myNoti=new Notification();
/* 设定status bar显示的icon */
myNoti.icon=iconImg;
/* 设定notification发生时她时发叨预设声音 */
myNoti.defaults=Notification.DEFAULT_SOUND;
myNoti.setLatestEventInfo(this,"防蚊服务启动",icontext,appIntent);
/* 送出Notification */
notiManager.notify(iconId,myNoti);
}
/* 删除Notification的method */
public void deleteNoti(int iconId)
{
notiManager.cancel(iconId);
}
@Override
public IBinder onBind(Intent arg0)
{
return null;
}
}
2.主程序类
package irdc.ex10_08;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.Toast;
public class EX10_08 extends Activity
{
public static final String MY_PREFS = "MosPre";
private ImageButton button01;
private ImageView image01;
private int mosStatus;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
/* 加载main.xml Layout */
setContentView(R.layout.main);
/* 取得保存在SharedPreferences的防蚊状态 */
SharedPreferences pres =
getSharedPreferences(MY_PREFS,Context.MODE_PRIVATE);
if(pres !=null)
{
mosStatus = pres.getInt("status", 0);
}
image01 = (ImageView)findViewById(R.id.image01);
button01 = (ImageButton)findViewById(R.id.button01);
/*检查mosStatus是否启动状态(1) */
if (mosStatus==1)
{
/* 设置启动图案 */
image01.setImageResource(R.drawable.mos_open);
button01.setBackgroundResource(R.drawable.power_on);
}
else
{
/* 设置关闭图案 */
image01.setImageResource(R.drawable.mos_close);
button01.setBackgroundResource(R.drawable.power_off);
}
button01.setOnClickListener(new Button.OnClickListener()
{
@Override
public void onClick(View v)
{
if (mosStatus==1)
{
SharedPreferences pres =
getSharedPreferences(MY_PREFS,Context.MODE_PRIVATE);
if(pres!=null)
{
/* 设定状态为关闭(0) */
mosStatus=0;
SharedPreferences.Editor ed = pres.edit();
ed.putInt("status",mosStatus);
ed.commit();
}
/* 设定关闭图案 */
image01.setImageResource(R.drawable.mos_close);
button01.setBackgroundResource(R.drawable.power_off);
/* 终止service */
stopMyService(1);
}
else if(mosStatus==0)
{
SharedPreferences pres =
getSharedPreferences(MY_PREFS,Context.MODE_PRIVATE);
if(pres!=null)
{
/* 设定状态为启动(1) */
mosStatus=1;
SharedPreferences.Editor ed = pres.edit();
ed.putInt("status",mosStatus);
ed.commit();
}
/*设定启动图案*/
image01.setImageResource(R.drawable.mos_open);
button01.setBackgroundResource(R.drawable.power_on);
/* 启动service */
startMyService();
}
else
{
Toast.makeText(EX10_08.this,"系统错误",Toast.LENGTH_LONG)
.show();
}
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu)
{
/* 叵丈离开的menu */
menu.add(0,1,1,"").setIcon(R.drawable.menu_exit);
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item)
{
switch(item.getItemId())
{
case (1):
/* 离开前ALERT提醒 */
new AlertDialog.Builder(EX10_08.this)
.setTitle("Message")
.setMessage("确定要离开吗?")
.setPositiveButton("确定",
new DialogInterface.OnClickListener()
{
public void onClick(DialogInterface dialoginterface,int i)
{
finish();
}
}
).setNegativeButton("取消", new DialogInterface.OnClickListener()
{
public void onClick(DialogInterface dialoginterface, int i)
{
}
}).show();
break;
}
return super.onOptionsItemSelected(item);
}
public void startMyService()
{
try
{
/* 先终止之前可能还在运行的service */
stopMyService(0);
/* 启动MyService */
Intent intent = new Intent( EX10_08.this, MyService.class);
intent.setFlags( Intent.FLAG_ACTIVITY_NEW_TASK );
startService(intent);
Toast.makeText(EX10_08.this,getResources().getString(R.string.start),
Toast.LENGTH_LONG).show();
}
catch(Exception e)
{
e.printStackTrace();
}
}
public void stopMyService(int flag)
{
try
{
/* 停止MyService */
Intent intent = new Intent( EX10_08.this, MyService.class );
stopService(intent);
if(flag==1)
{
Toast.makeText(EX10_08.this,getResources().getString(R.string.stop),
Toast.LENGTH_LONG).show();
}
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
3.Service的注册
<service
android:name=".MyService"
android:exported="true"
android:process=":remote"
/>
4.布局文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:background="@drawable/white"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:gravity="center_horizontal"
>
<ImageView
android:id="@+id/image01"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingTop="30dip"
/>
<ImageButton
android:id="@+id/button01"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="20dip"
/>
</LinearLayout>