zoukankan      html  css  js  c++  java
  • 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路径是:CallPhonesrccomexamplecallphone,所以最终显示的包名是: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


  • 相关阅读:
    945.使数组唯一的最小增量
    用两个栈实现队列
    MySQL的约束
    数据库的设计
    约束
    DQL查询
    数据库的基本概念
    SQL基础语法
    MySQL基础
    java的注解和反射
  • 原文地址:https://www.cnblogs.com/smilefortoday/p/4021886.html
Copyright © 2011-2022 走看看