转:http://blog.csdn.net/zhandoushi1982/article/details/8501773

Context字面意思上下文,位于framework 的android.content.Context中。其实该类为LONG型,类似Win32中的Handle句柄,很多方法需要通过Context才能 得到调用者的实例,比如说Toast的第一个参数就是Context,一般在Activity中我们直接用this代替;而到了一个button的 onClick(View view)等方法时,我们用this时就会报错,我们可能使用ActivityName.this来解决(或者 getBaseContext()/getApplicationContext())。

实现Context的类主要有Android特有的几个模型,Activity、Service以及BroadcastReceiver。 Context提供了关于应用环境全局信息的接口,同时启动应用级的操作,如启动Activity,broadcasting和接收intents。应用 程序App共有的Context数目公式为: 总Context实例个数 = Service个数 + Activity个数 + 1(Application对应的Context实例)。

BroadcastReceiver使用Context是通过在public void onReceive(Context context, Intent intent)这个形参来使用的。

================================================================================================================================

利用android.app.Activity.getSystemService这个方法,可以获得系统常用的服务及一些列方法。举例如下:

(1) 获得当前正在运行的应用包名

创建一个activity,首先在XML中要添加获取系统运行任务的权限:

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

否则运行时会报异常:java.lang.SecurityException: Permission Denial:。。。。。。requires android.permission.GET_TASKS
        响应核心源码如下:

import android.app.ActivityManager;

public class MainActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
Log.i("zhangcheng","run here");
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView strText = (TextView)findViewById(R.id.callinfo); ActivityManager activityManager = (ActivityManager)getSystemService(Context.ACTIVITY_SERVICE); //获得页面管理服务
String currentPackageName = ""; currentPackageName = activityManager.getRunningTasks(1)
.get(0).topActivity.getPackageName(); //获得当前运行任务顶层页面的包名
strText.setText(currentPackageName);
}
}

我的java src路径是:CallPhone\src\com\example\callphone\,所以最终显示的包名是:com.example.callphone。

=========================================================================================
       有时需要判断当前app是否联网,是用的WIFI还是其他网络连接方式等。核心代码如下:

(1)当前联网网络类型,是否联网了

		ConnectivityManager manager = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
if(manager == null)
return;
NetworkInfo activeNetworkInfo = manager.getActiveNetworkInfo();
if(activeNetworkInfo == null)
return;
TextView display = (TextView)findViewById(R.id.testview1); if((activeNetworkInfo.getType() == ConnectivityManager.TYPE_WIFI)
&& activeNetworkInfo.isConnected()){
display.setText("WIFI NET");
}else if(activeNetworkInfo.getType() == ConnectivityManager.TYPE_MOBILE
&& activeNetworkInfo.isConnected()){
display.setText("MOBILE NET");
}

需要的权限

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

(2)开关WIFI:

用到的权限

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

开关按钮

WifiManager wifiManager;
wifiManager = (WifiManager)getSystemService(Context.WIFI_SERVICE); public void onClick(View v){
if(wifiManager.isWifiEnabled()){
wifiManager.setWifiEnabled(false);
}else{
wifiManager.setWifiEnabled(true);
}
}

(3)开关移动网络。这个比较复杂,由于ConnectivityManager的setMobileDataEnabled函数是隐藏的,所以必 须采用JAVA函数反射来调用到(JAVA反射相关内容可以参见他人的博文http://write.blog.csdn.net/postedit /8501773,目前会用但是理解不透)。

定义全局变量

	Context context = this;
ConnectivityManager manager;
TextView display;

页面的onCreate函数初始化

manager = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
if(manager == null)
return;
display = (TextView)findViewById(R.id.testview1); //提示当前移动网络状态

反射函数

public boolean invokeMethod(String methodName,Object[]  arg) throws Exception {
Class ownerClass = manager.getClass();
Class[] argsClass = null;
if (arg != null) {
argsClass = new Class[1];
argsClass[0] = arg.getClass();
}
Method method = ownerClass.getMethod(methodName, argsClass);
Boolean isOpen = (Boolean) method.invoke(manager, arg);
return isOpen;
} public Object invokeBooleanArgMethod(String methodName,boolean value) throws Exception {
Class ownerClass = manager.getClass();
Class[] argsClass = new Class[1];
argsClass[0] = boolean.class;
Method method = ownerClass.getMethod(methodName,argsClass);
return method.invoke(manager, value);
}

反复单击一个按钮,可以看到移动网络在开关切换,从状态栏图标可以看出,从页面的textview文本也可以看出是对应的。

	public void onClick(View v){
//Log.i("zhangcheng","click");
Object[] arg = null;
try {
boolean isMobileDataEnable = invokeMethod("getMobileDataEnabled", arg);
if(!isMobileDataEnable){
invokeBooleanArgMethod("setMobileDataEnabled", true);
display.setText("MOBILE NET ON");
}
else{
invokeBooleanArgMethod("setMobileDataEnabled", false);
display.setText("MOBILE NET OFF");
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

需要的权限

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

============================================================================================

通过程序获取android系统手机的铃声和音量。同样,设置铃声和音量的方法也很简单!

AudioManager mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
(1)通话音量

int max = mAudioManager.getStreamMaxVolume( AudioManager.STREAM_VOICE_CALL );
int current = mAudioManager.getStreamVolume( AudioManager.STREAM_VOICE_CALL );
Log.d(”VIOCE_CALL”, “max : ” + max + ” current : ” + current);  

(2)系统音量

max = mAudioManager.getStreamMaxVolume( AudioManager.STREAM_SYSTEM );
current = mAudioManager.getStreamVolume( AudioManager.STREAM_SYSTEM );
Log.d(”SYSTEM”, “max : ” + max + ” current : ” + current);

(3)铃声音量

max = mAudioManager.getStreamMaxVolume( AudioManager.STREAM_RING );
current = mAudioManager.getStreamVolume( AudioManager.STREAM_RING );
Log.d(”RING”, “max : ” + max + ” current : ” + current);

(4)音乐音量

max = mAudioManager.getStreamMaxVolume( AudioManager.STREAM_MUSIC );
current = mAudioManager.getStreamVolume( AudioManager.STREAM_MUSIC );
Log.d(”MUSIC”, “max : ” + max + ” current : ” + current);

(5)提示声音音量

max = mAudioManager.getStreamMaxVolume( AudioManager.STREAM_ALARM );
current = mAudioManager.getStreamVolume( AudioManager.STREAM_ALARM );
Log.d(”ALARM”, “max : ” + max + ” current : ” + current);  

设置音量的方法也很简单:public void setStreamVolume(int streamType, int index, int flags)  ,其中streamType为铃声类型,例如:AudioManager.STREAM_VOICE_CALL、 AudioManager.STREAM_SYSTEM等,index为音量大小,falgs为标志位。

以下是修改音频设置:

(6)通话时设置静音

System.out.println("isMicrophoneMute =" + audioManager.isMicrophoneMute());
audioManager.setMicrophoneMute(!audioManager.isMicrophoneMute());

(7)通话时设置免提

System.out.println("isSpeakerphoneOn =" + audioManager.isSpeakerphoneOn());
audioManager.setSpeakerphoneOn(!audioManager.isSpeakerphoneOn());

别忘了修改的权限 <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS"/>
===========================================================================================
        设置振动:

mVibrator = (Vibrator) mContext.getSystemService(Service.VIBRATOR_SERVICE);
long[] pattern = {150, 100}; // OFF/ON/OFF/ON...
mVibrator.vibrate(pattern, -1);

参考原文:http://www.cnblogs.com/wgw8299/articles/2128202.html

参考原文:http://blog.csdn.net/comkingfly/article/details/7359950

参考原文:http://blog.csdn.net/ponderforever/article/details/7167591

参考原文:http://blog.csdn.net/gf771115/article/details/6996577

Android的Context && 安卓常用系统服务(当前运行包名/当前网络状态和开关网络/音频服务/马达服务) (转)的更多相关文章

  1. android.content.Context 含义及使用

    Context字面意思上下文,位于framework package的android.content.Context中,其实该类为LONG型,类似Win32中的Handle句柄,很多方法需要通过Con ...

  2. (一)Android开发之安卓系统的前世今生

    1 什么是Android Android中文名称"安卓",英文含义为"机器人",Android是谷歌旗下的一款基于linux平台的开源操作系统.主要使用于移动设 ...

  3. 详细解说Android权限在安卓开发中

    android.permission.ACCESS_CHECKIN_PROPERTIES //允许读写访问”properties”表在checkin数据库中,改值可以修改上传 android.perm ...

  4. Android中Context的总结及其用法

    在android中我们经常遇到这样的情况,在创建一个对象的时候往往需要传递一个this参数,比如:语句 MyView mView = new MyView(this),要求传递一个this参数,这个t ...

  5. 安卓常用的xml控件配件的使用包含shape,declare-styleable、selector

    今天就讲我所遇到的常用到的一些通过xml文件制作的背景效果,以后用到的话就直接使用啦!哈哈,我一向就是这么懒! 接下来,就开始介绍了 1.shape的使用,可以混合使用 xml控件配置属性 andro ...

  6. 单页Html及Android App供小孩学习常用汉字

    为了检验及帮助小孩学习常用汉字,简单开发本网页应用: 常用汉字是按使用频率排序的,来源于网上: 该简单应用 有Android APP下载 “学习常用汉字_20150910.apk” 单页Html 示例 ...

  7. 【Android】利用安卓的数据接口、多媒体处理编写内存卡Mp3播放器app

    通过调用安卓的MediaPlayer能够直接完毕Mp3等主流音频的播放,同一时候利用ContentResolver与Cursor能够直接读取安卓内在数据库的信息.直接获取当前sdcard中全部音频的列 ...

  8. Android ADB原理及常用命令

    Android调试桥(ADB, Android Debug Bridge)是一个Android命令行工具,包含在SDK 平台工具包中,adb可以用于连接Android设备,或者模拟器,实现对设备的控制 ...

  9. 用Android Studio开发最常用到的快捷键

    Android Studio常用快捷键 Android Studio日常开发常用快捷键. 快捷键版本: Mac OS X 10.5+ 搜索查看类 用途 Mac快捷键 搜索所有文件 double Shi ...

随机推荐

  1. CF 39E. What Has Dirichlet Got to Do with That?(记忆化搜索+博弈论)

    传送门 解题思路 首先很好写出一个\(O(ab)\)的记搜,但发现这样无法处理\(a=1\)和\(b=1\)的情况,这两种情况需要特判.首先\(a=1\)的情况,就是如果当前选手让\(a+1\)必胜, ...

  2. POJ - 1655 (点分治-树的重心)

    题目:https://vjudge.net/contest/307753#problem/D 题意:给你一棵树,让你求出一个点,让他的最大子树的节点数尽量小 思路:最大子树节点数尽量小,一看就是树的重 ...

  3. C# foreach和for比较

    foreach优点: 1.语句更简洁 2.不需要强制类型转换(比如输出的时候要进行一下乘运算) 3.多维数组遍历只需一行代码 4.不用对索引进行检查 缺点: 1.不能对数据进行修改 参考:https: ...

  4. Maven之搭建本地私服(nexus)仓库

    摘要:现在越来越多的项目都在使用Maven管理项目,尤其是在大型的项目团队中使用Maven能带来更加多的好处,私服的好处我相信大家都明白,在这里我就不多说了,它最重要的作用就是可以让项目团队成员更加方 ...

  5. java的实用类

    1)   Random类 用于生成随机数字,所有生成的数字,都是等概率的. nextInt():生成的值介于int的所有取值范围(-231 ~ 231-1) nextInt(int value):生成 ...

  6. Python for Eclipse插件Pydev安装后eclipse里面看不到

    反复安装几次在eclipse里面都找不到,崩溃了,有的说是pydev版本不对,应该和python版本一致,都是扯淡,去pydev官网看了下requirement原来是需要Java1.7+以上,安装1. ...

  7. C++中的面向对象(二)

    1,类之间的基本关系: 1,继承: 1,从已存在类细分出来的类和原类之间具有继承关系(is-a): 1,子类就是一个(is-a)父类: 2,继承是单向的: 2,继承的类(子类)拥有原类(父类)的所有属 ...

  8. java并发编程之美-阅读记录2

    2.1什么是多线程并发编程 并发:是指在同一时间段内,多个任务同时在执行,并且执行没有结束(同一时间段又包括多个单位时间,也就是说一个cpu执行多个任务) 并行:是指在单位时间内多个任务在同时执行(也 ...

  9. size - 列出段节大小和总共大小

    总览 (SYNOPSIS) size [-A|-B|--format=compatibility] [--help] [-d|-o|-x|--radix=number] [--target=bfdna ...

  10. cglib代理与jdk动态代理示例

    先看基于jdk实现的动态代理实现例子 1.先声明一个接口类 public interface UserService{ public String getName(String msg); } 2.实 ...