context & service

context:

        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)这个形参来使用的。


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


service:

        利用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) {   
            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还是其他网络连接方式等。

核心代码如下:

    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" />

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

开关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);  
            }  
    }  

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

开关移动网络。

这个比较复杂,由于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



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值