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

转: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

时间: 2024-10-07 20:42:26

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

Android常用系统服务

通过Activity类的getSystemService方法可以获得指定的系统服务. getSystemService方法只有一个String类型的参数,表示系统服务的ID,这个ID在整个Android系统中是唯一的. Android SDK在android.content.Context类中定义了这些ID.如下: Constants AccessibilityManager ACCESSIBILITY_SERVICE 通过已注册的事件监听器将UI事件反馈给用户. 主要是一些View获得点击.焦

使用Android Studio进行安卓开发教程

本教程介绍如何创建Android应用程序.它基于Android5.0(Lollipop)介绍Android Studio的用法. 安卓介绍 Android是基于Linux内核的操作系统.负责开发Android系统的项目被为Android Open Source Project (AOSP) ,由谷歌领导. Android系统支持后台处理,提供了丰富的用户界面库,使用的OpenGL标准支持2-D和3-D图形,并允许访问文件系统以及嵌入式SQLite数据库. Android应用包含可见和不可见组件,

【Android】Context, What Context

What Context? 英文原文:Context, What Context?译文Github地址:Context, What Context? Context Context 估计是 Android 开发中最常用的元素了,它的获取和使用如此普遍,加载资源,启动新的 Activity,获取系统服务,获取内部文件路径以及创建 View 都离不开 Context.同时,Context 也是最容易误操作的元素,以致于很容易把你带到坑里面去.下面就让我们全面对比了解一下 Context,让你的开发更

安卓常用实用功能代码片大全(长期更新)

看别人博客,有些小技巧就直接转过来了,以后做开发可以大大提高开发效率.以下代码片摘自多个博客和自己平时的学习积累,若原作者认为侵犯著作权,请私信告知,我看到后讲第一时间删除. 一.  获取系统版本号: PackageInfo info = this.getPackageManager().getPackageInfo(this.getPackageName(), 0); int versionCode=nfo.versionCode string versionName=info.version

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

1 什么是Android Android中文名称"安卓",英文含义为"机器人",Android是谷歌旗下的一款基于linux平台的开源操作系统.主要使用于移动设备,如智能手机和平板电脑,由Google公司和开放手机联盟领导及开发.该平台由操作系统.中间件.用户界面和应用软件组成.?   底层Linux内核只提供基本功能,其他的应用软件则由各公司自行开发,大部分程序以Java语言编写. 2 Android的发展历程(来源百度百科) 2003年10月,Andy Rubi

[Android 新特性] 安卓4.4新特性详解

在本月初,谷歌的5太子google  nexus5正式发布了,还给大家带来了全新的安卓android4.4的操作系统,并且官网给大家带来了新的说法,就是安卓4.4会比之前的系统更加省电,这个到底是为什么呢?网侠小编就来说说安卓4.4的为何省电的工作机制. 首先,我们要搞清楚一个问题,那就是什么是Dalvik? 在整个Android 4.4的更新特性中,最引人瞩目的应该就是虚拟机由Dalvik转成ART,也就是“中间件”的变更(Midware).先来看看什么是Dalvik. 如图,Dalvik虚拟

Android之独孤口诀:模拟器创建及adb(android debug bridge安卓调试桥)

VGA:640*480 像素 HVGA(half vga):480*320 像素 QVGA(quarter vga):320*240 像素 WVGA(width vga):800*480 像素 FWVGA:854*480 二.adb(android debug bridge:安卓调试桥) 常用命令: pull: adb pull  /storage/sdcard1/DCIM/Camera/IMG_20141124_193236.jpg  abc.jpg  (将 /storage/sdcard1/

Android(permission)常用权限

Android应用需要在AndroidManifest.xml添加某些权限.才能调用系统功能.如应用提供震动功能.必须在配置文件中加入震动权限. 属性 说明 android.permission.ACCESS_CHECKIN_PROPERTIES 允许读写访问 "properties"表在checkin数据库中,改值可以修改上传 android.permission.ACCESS_COARSE_LOCATION 通过WiFi或移动基站的方式获取用户错略的经纬度信息,定位精度大概误差在3

Android中Context的总结及其用法

在语句 android中我们经常遇到这样的情况,在创建一个对象的时候往往需要传递一个this参数,比如:语句 MyView mView = new MyView(this),要求传递一个this参数,这个this究竟指的是什么东西呢? 其实这里的this指的就是当前的Activity.this,是这个语句所在的Activity的this.Activity.this取的是这个Activity的Context,那么这个Context究竟是什么东西呢?它起到什么作用呢? Context 按照英文字面意