Android的Service与BroadcastReceiver之三 TelephonyManager、SmsManager、AudioManager、Vibrator、AlarmManager

本文详细介绍了如何在Android程序中获取TelephonyManager、SmsManager、AudioManager和Vibrator的相关信息,并展示了如何远程调用AIDLService及使用AlarmManager实现定时任务。此外,还提供了一个实例代码来演示如何使用Vibrator控制手机振动。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >



TelephonyManager
在程序中获取TelephonyManager只需要调用一下代码:
TelephonyManager tManager =
(TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
示例代码:
public class TelephonyStatus extends ActionBarActivity {

ListView showView;
String[] statusNames;
ArrayList<String> statusValues = new ArrayList<String>();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        TelephonyManager tManager = (TelephonyManager)
        getSystemService(Context.TELEPHONY_SERVICE);
        statusNames = getResources().getStringArray(R.array.statusNames);
        String[] simState = getResources()
        .getStringArray(R.array.simState);
        String[] phoneType = getResources().getStringArray(
        R.array.phoneType);
        statusValues.add(tManager.getDeviceId());
        statusValues.add(tManager.getDeviceSoftwareVersion()
        != null ? tManager.getDeviceSoftwareVersion():"unknown");
        statusValues.add(tManager.getNetworkOperator());
        statusValues.add(tManager.getNetworkOperatorName());
        statusValues.add(phoneType[tManager.getPhoneType()]);
        statusValues.add(tManager.getCellLocation()!= null?tManager
        .getCellLocation().toString() : "unknown location");
        statusValues.add(tManager.getSimCountryIso());
        statusValues.add(tManager.getSimSerialNumber());
        statusValues.add(simState[tManager.getSimState()]);
        showView = (ListView) findViewById(R.id.show);
        ArrayList<Map<String, String >> status =
        new ArrayList<Map<String, String>>();
        for (int i = 0; i < statusValues.size(); i++)
        {
        HashMap<String, String> map = new HashMap<String, String>();
        map.put("name", statusNames[i]);
        map.put("valu", statusValues.get[i]);
        status.add(map);
        }
        SimpleAdapter adapter = new SimpleAdapter(this, status
        , R.layout.line, new String[]{"name","value"}
        , new int []{R.id.name, R.id.value});
        showView.setAdapter(adapter);
    }
}
为了调用远程的AIDL Service,开发者需要将Android源代码中如下两个文件复制到项目的相应位置
  • com.android.internal.telephony包下的ITelephony.aidl
  • android.telephony包下的NeighboringCellInfo.aidl


SmsManager
使用SmsManager发送短信,调用sendTextMessage()即可
另外需要授予程序发送短信的权限
<uses-permission android:name=“android.permission.SEND_SMS"/>
示例代码如下:
public class GroupSend extends ActionBarActivity {

EditText numbers, content;
Button select, send;
SmsManager sManager;
ArrayList<String> sendList = new ArrayList<String>();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        sManager = SmsManager.getDefault();
        numbers = (EditText) findViewById(R.id.numbers);
        content = (EditText) findViewById(R.id.content);
        select = (Button) findViewById(R.id.select);
        send = (Button) findViewById(R.id.send);
        send.setOnClickListener(new OnClickListener()
        {
        @Override
        public void onClick(View arg0)
        {
        for(String number: sendList)
        {
        PendingIntent pi = PendingIntent.getActivity(
        GroupSend.this, 0, new Intent(), 0);
        sManager.sendTextMessage(number, null
        , content.getText().toString(), pi, null);
        }
        Toast.makeText(GroupSend.this, "group send completed"
        , Toast.LENGTH_SHORT).show();
        }
        });
        select.setOnClickListener(new OnClickListener()
        {
        @Override
        public void onClick(View v)
        {
        final Cursor cursor = getContentResolver().query(
        ContactsContract.CommonDataKinds.Phone.CONTENT_URI
        , null, null, null, null);
        BaseAdapter adapter = new BaseAdapter()
        {
        @Override
        public int getCount()
        {
        return cursor.getCount();
        }
        @Override
        public Object getItem(int position)
        {
        return position;
        }
        @Override
        public long getItemId(int position)
        {
        return position;
        }
        @Override
        public View getView(int position
        ,View convertView, ViewGroup parent)
        {
        cursor.moveToPosition(position);
        CheckBox rb = new CheckBox(GroupSend.this);
        String number = cursor
        .getString(curosr.getColumnIndex(ContactsContract
        .CommonDataKinds.Phone.NUMBER))
        .replace("-", "")
        .replace(" ", "");
        rb.setText(number);
        if(isChecked(number))
        {
        rb.setChecked(true);
        }
        return rb;
        }
        };
        View selectView = getLayoutInflater().inflate(
        R.layout.list, null);
        final ListView listView = (ListView) selectView
        .findViewById(R.id.list);
        listView.setAdapter(adapter);
        new AlertDialog.Builder(GroupSend.this)
        .setView(selectView)
        .setPositionButton("sure",
        new DialogInterface.OnClickListener()
        {
        @Override
        public void onClick(DialogInterface dialog,
        int which)
        {
        sendList.clear();
        for(int i = 0; i < listView.getCount(); i++)
        {
        CheckBox checkBox = (CheckBox) listView.getChildAt(i);
        if(checkBox.isChecked())
        {
        sendList.add(checkBox.getText().toString());
        }
        }
        number.setText(sendList.toString());
        }
        }).show();
        }
        });
    }
    public boolean isChecked(String phone)
    {
    for(String s1 : sendList)
    {
    if( s1.equals(phone))
    {
    return true;
    }
    }
    return false;
    }


AudioManager
在程序获取AudioManager对象之后,接下来就可调用AudioManager的如下常用方法来控制手机音频了
  1. adjustStreamVolume(int streamType, int direction, int flags)调整手机指定类型的声音,其中,第一个streamType参数可以接受的值(STREAM_DTMF、STREAM_MUSIC、STREAM_NOTIFICATION、STREAM_RING、STREAM_SYSTEM、STREAM_VOICE_CALL);第二个参数指定对声音进行增大还是减小;第三个参数是调整声音时的标志
  2. setMicrophoneMute(boolean on):设置是否让麦克风静音
  3. setMode(int mode):设置声音模式,可设置的值有NORMAL、RINGTONE和IN_CALL
  4. setRingerMode(int ringerMode):设置手机的电话铃声的模式;有三种模式(RINGER_MODE_NORMAL、RINGER_MODE_SILENT、RINGER_MODE_VIBRATE
  5. setSpeakerphoneOn(boolean on):设置是否打开扩音器
  6. setStreamMute(int streamType, boolean state):将手机的指定类型的声音调整为静音
  7. setStreamVolume(int streamType, int index, int flags):直接设置手机指定类型的音量值
示例代码:
public class AudioTest extends ActionBarActivity {

Button play,up,down;
ToggleButton mute;
AudioManager aManager;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        aManager = (AudioManager) getSystemService(
        Service.AUDIO_SERVICE);
        play = (Button) findViewById(R.id.play);
        up = (Button) findViewById(R.id.up);
        down = (Button) findViewById(R.id.down);
        mute = (ToggleButton) findViewById(R.id.mute);
        play.setOnClickListener(new OnClickListener()
        {
        @Override
        public void onClick(View source)
        {
        MediaPlayer mPlayer = MediaPlayer.create(
        AudioTest.this, R.raw.earth);
        mPlayer.setLooping(true);
        mPlayer.start();
        }
        });
        up.setOnClickListener(new OnClickListener()
        {
        @Override
        public void onClick(View source)
        {
        aManager.adjustStreamVolume(AudioManager.STREAM_MUSIC
        , AudioManager.ADJUST_RAISE, AudioManager.FLAG_SHOW_UI);
        }
        });
        down.setOnClickListener(new OnClickListener()
        {
        @Override
        public void onClick(View source)
        {
        aManager.adjustStreamVolume(AudioManager.STREAM_MUSIC
        , AudioManager.ADJUST_LOWER, AudioManager.FLAG_SHOW_UI);
        }
        });
        mute.setOnCheckedChangeListener(new OnCheckedChangeListener()
        {
        @Override
        public void onCheckedChanged(CompoundButton source,
        boolean isChecked)
        {
        aManager.setStreamMute(AudioManager.STREAM_MUSIC,
        isChecked);
        }
        });
    }
}


振动器 Vibrator
获取Vibrator也是调用Context的getSystemService()方法即可
  1. vibrate(long milliseconds):控制手机振动milliseconds毫秒
  2. vibrate(long[] pattern, int repeat):指定手机以pattern指定模式振动。例如指定pattern为new int[400,800,1200,1600],repeat为数组索引,指定对pattern数组中从repeat索引开始的振动进行循环
  3. cancel():关闭手机振动
示例代码:
public class VibratorTest extends ActionBarActivity {

Vibrator vibrator;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        vibrator = (Vibrator) getSystemService(
        Service.VIBRATOR_SERVICE);
    }
    @Override
    public boolean onTouchEvent(MotionEvent event)
    {
    Toast.makeText(this, "phone vibrate",
    Toast.LENGTH_SHORT).show();
    vibrator.vibrate(2000);
    return super.onTouchEvent(event);
    }
}
另外,需要授权:
<uses-permission android:name=“android.permission.VIBRATE”/>

手机闹钟 AlarmManager
AlarmManager通常用途即为开发手机闹钟,但实际上它的作用不止于此,它的本质是一个全局定时器,AlarmManager可在指定时间或指定周期启动其他组件(包括Activity、Service、Broadcast)
Android应用也是通过Context的getSystemService()方法来获取AlarmManager对象,有如下方法
  • set(int type, long triggerAtTime, PendingIntent operation):设置在triggerAtTime时间启动有operation参数指定的组件。其中第一个参数指定定时服务类型,可接受如下值
    • ELAPSED_REALTIME:从现在开始时间过了一定时间后启动operation所对应的组件
    • ELAPSED_REALTIME_WAKEUP:指定中现在开始过了一定时间后启动operation所对应的组件。即使系统关机也会执行operation所对应的组件
    • RTC指定当系统调用System.currentTimeMillis()方法返回值与triggerAtTime相等时启动operation所对应的组件
    • RTC_WAKEUP:即使关机也会执行
  • setInexactRepeating(int type, long triggerAtTime, long interval, PendingIntent operation):设置一个非常精确的周期性任务
  • setRepeating(int type, long triggerAtTime, long interval, PendingIntent operation):设计一个周期性执行的定时服务
  • cancel(PendingIntent operation):取消AlarmManager的定时服务
示例代码:
public class AlarmTest extends ActionBarActivity {

Button setTime;
AlarmManager aManager;
Calendar currentTime = Calendar.getInstance();

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
setTime = (Button) findViewById(R.id.setTime);
aManager = (AlarmManager) getSystemService(Service.ALARM_SERVICE);
setTime.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View source) {
Calendar currentTime = Calendar.getInstance();
new TimePickerDialog(AlarmTest.this, 0,
new TimePickerDialog.OnTimeSetListener() {

@Override
public void onTimeSet(TimePicker tp, int hourOfDay,
int minute) {
// TODO Auto-generated method stub
Intent intent = new Intent(AlarmTest.this,
AlarmActivity.class);
PendingIntent pi = PendingIntent.getActivity(
AlarmTest.this, 0, intent, 0);
Calendar c = Calendar.getInstance();
c.setTimeInMillis(System.currentTimeMillis());
c.set(Calendar.HOUR, hourOfDay);
c.set(Calendar.MINUTE, minute);
aManager.set(AlarmManager.RTC_WAKEUP,
c.getTimeInMillis(), pi);
Toast.makeText(AlarmTest.this,
"alarm set up ok", Toast.LENGTH_SHORT)
.show();
}
}, currentTime.get(Calendar.HOUR_OF_DAY), currentTime
.get(Calendar.MINUTE), false).show();
}
});
}
}
AlarmActivity代码
public class AlarmActivity extends Activity {
MediaPlayer alarmMusic;
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
alarmMusic = MediaPlayer.create(this, R.raw.alarm);
alarmMusic.setLooping(true);
alarmMusic.start();
new AlertDialog.Builder(AlarmActivity.this).setTitle("alarm")
.setMessage("alarm ring, go, go")
.setPositiveButton("sure", new OnClickListener(){
@Override
public void onClick(DialogInterface dialog, int which)
{
alarmMusic.stop();
AlarmActivity.this.finish();
}
}).show();
}
}
定时更换壁纸的API为WallpaperManager,它提供了clear()方法来清除壁纸,还提供了如下方法来设置壁纸
  • setBitmap(Bitmap bitmap)
  • setResource(int resid)
  • setStream(InputStream data)
示例代码
public class AlarmChangeWallpaper extends ActionBarActivity {
AlarmManager aManager;
Button start,stop;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        start = (Button) findViewById(R.id.start);
        stop = (Button) findViewById(R.id.stop);
        aManager = (AlarmManager) getSystemService(Service.ALARM_SERVICE);
        Intent intent = new Intent(AlarmChangeWallpaper.this
        ,ChangeService.class);
        final PendingIntent pi = PendingIntent.getService(
        AlarmChangeWallpaper.this, 0 ,intent, 0);
        start.setOnClickListener(new OnClickListener()
        {
        @Override
        public void onClick(View arg0)
        {
        aManager.setRepeating(AlarmManager.RTC_WAKEUP
        , 0, 5000, pi);
        start.setEnabled(false);
        stop.setEnabled(true);
        Toast.makeText(AlarmChangeWallpaper.this
        , "changeWallpaper ok", Toast.LENGTH_SHORT).show();
        }
        });
        stop.setOnClickListener(new OnClickListener()
        {
        @Override
        public void onClick(View arg0)
        {
        start.setEnabled(true);
        stop.setEnabled(false);
        aManager.cancel(pi);
        }
        });
    }
}
ChangeService代码
public class ChangeService extends Service{
int[] wallpapers = new int[]{
R.drawable.shuangta,
R.drawable.lijiang,
R.drawable.qiao,
R.drawable.shui
};
WallpaperManager wManager;
int current = 0;
@Override
public int onStartCommand(Intent intent, int flags, int startId)
{
if (current >= 4)
current = 0;
try{
wManager.setResource(wallpapers[current++]);
}catch(Exception e){
e.printStackTrace();
}
return START_STICKY;
}
@Override
public void onCreate()
{
super.onCreate();
wManager = WallpaperManager.getInstance(this);
}
@Override
public IBinder onBind(Intent intent)
{
return null;
}

}
修改壁纸需要授予权限
<uses-permision android:name=“android.permission.SET_WALLPAPER”/>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值