当前位置:  编程技术>移动开发
本页文章导读:
    ▪BroadcastReceiver简介跟用法实例,两种注册方式 (二)        BroadcastReceiver简介和用法实例,两种注册方式 (二) 一.BroadcastReceiver简介     BraodcastReceiver(广播接收器)是为了实现系统广播而提供的一种组件,它和事件处理机制类似,但是事件处理机.........
    ▪ 获取在运行的服务        获取正在运行的服务 package com.jf.getservice; import java.util.Iterator; import java.util.List; import android.app.Activity; import android.app.ActivityManager; import android.app.ActivityManager.RunningServiceInfo; import android.app.Servi.........
    ▪ Papago 领航破解过程       Papago 导航破解过程 一.必要知识对汇编语言有所了解.我其实也没用过arm汇编,.但是因为有80x86的经验.对于arm指令看10分钟也就会了.对android程序编写有一定了解。掌握程序加载执行流程。对.........

[1]BroadcastReceiver简介跟用法实例,两种注册方式 (二)
    来源: 互联网  发布时间: 2014-02-18
BroadcastReceiver简介和用法实例,两种注册方式 (二)

一.BroadcastReceiver简介 

   BraodcastReceiver(广播接收器)是为了实现系统广播而提供的一种组件,它和事件处理机制类似,但是事件处理机制是程序组件级别的,而广播事件处理机制是系统级别的。比如,我们可以发出一种广播来测试手机电量的变化,这时候就可以定义一个BraodcastReceiver来接受广播,当手机电量较低时提示用户。我们既可以用Intent来启动一个组件,也可以用sendBroadcast()方法发起一个系统级别的事件广播来传递消息。我们同样可以在自己的应用程序中实现BroadcastReceiver来监听和响应广播的Intent。

   在程序中使用BraodcastReceiver是比较简单的。首先要定义一个类继承BraodcastReceiver,并且覆盖onReceiver()方法来响应事件。然后注册在程序中BraodcastReceiver。最后构建Intent对象调用sendBroadcast()方法将广播发出。

二.BroadcastReceiver的注册方式

 1.静态注册方式

   静态注册方式是在AndroidManifest.xml的application里面定义receiver并设置要接收的action。静态注册方式的特点:不管改应用程序是否处于活动状态,都会进行监听,比如某个程序时监听内存 的使用情况的,当在手机上安装好后,不管改应用程序是处于什么状态,都会执行改监听方法中的内容。

下面是具体的例子:

MainActivity.java

  • package com.android.broadcast;  
  •  
  • import android.app.Activity;  
  • import android.content.Intent;  
  • import android.os.Bundle;  
  • import android.view.View;  
  • import android.view.View.OnClickListener;  
  • import android.widget.Button;  
  •  
  • public class MainActivity extends Activity{  
  •     //定义action常量  
  •     protected static final String ACTION = "com.android.broadcast.RECEIVER_ACTION";  
  •     //定义Button对象  
  •     private Button btnBroadcast;  
  •     @Override 
  •     public void onCreate(Bundle savedInstanceState){  
  •         super.onCreate(savedInstanceState);  
  •         setContentView(R.layout.main);  
  •         btnBroadcast=(Button)findViewById(R.id.btnBroadcast);  
  •         //为按钮设置单击监听器  
  •         btnBroadcast.setOnClickListener(new OnClickListener(){  
  •             @Override 
  •             public void onClick(View v){  
  •                 //实例化Intent  
  •                 Intent intent=new Intent();  
  •                 //设置Intent的action属性  
  •                 intent.setAction(ACTION);  
  •                 //发出广播  
  •                 sendBroadcast(intent);  
  •             }  
  •         });  
  •     }  
  • 在“com.android.broadcast”包中定义一个MyReceiver类,继承于BroadcastReceiver,覆盖onReceive()方法。

    MyReceiver.java

  • package com.android.broadcast;  
  •  
  • import android.content.BroadcastReceiver;  
  • import android.content.Context;  
  • import android.content.Intent;  
  • import android.util.Log;  
  •  
  • public class MyReceiver extends BroadcastReceiver{  
  •    //定义日志标签  
  •     private static final String TAG = "Test";  
  •     @Override 
  •     public void onReceive(Context context, Intent intent){  
  •         //输出日志信息  
  •         Log.i(TAG, "MyReceiver onReceive--->");  
  •     }  
  • }  
  • main.xml

  • <?xml version="1.0" encoding="utf-8"?> 
  • <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
  •     android:orientation="vertical" 
  •     android:layout_width="fill_parent" 
  •     android:layout_height="fill_parent" 
  •     > 
  •     <Button 
  •         android:id="@+id/btnBroadcast" 
  •         android:layout_width="match_parent" 
  •         android:layout_height="wrap_content" 
  •         android:text="发送Broadcast" 
  •         /> 
  • </LinearLayout> 
  • 在AndroidManifest.xml配置文件中16~20行声明receiver

  • <?xml version="1.0" encoding="utf-8"?> 
  • <manifest xmlns:android="http://schemas.android.com/apk/res/android" 
  •       package="com.android.broadcast" 
  •       android:versionCode="1" 
  •       android:versionName="1.0"> 
  •     <uses-sdk android:minSdkVersion="10" /> 
  •  
  •     <application android:icon="@drawable/icon" android:label="@string/app_name"> 
  •         <activity android:name=".MainActivity" 
  •                   android:label="@string/app_name"> 
  •             <intent-filter> 
  •                 <action android:name="android.intent.action.MAIN" /> 
  •                 <category android:name="android.intent.category.LAUNCHER" /> 
  •             </intent-filter> 
  •         </activity> 
  •         <receiver android:name="MyReceiver"> 
  •             <intent-filter> 
  •                 <action android:name="com.android.broadcast.RECEIVER_ACTION"/> 
  •             </intent-filter> 
  •         </receiver> 
  •     </application> 
  • </manifest> 
  • 效果图:

     

     当我们点击按钮的时候,程序会调用onReceive()方法,LogCat输出信息如下:

     2.动态注册方式

       动态注册方式在activity里面调用函数来注册,和静态的内容差不多。一个形参是receiver,另一个是IntentFilter,其中里面是要接收的action。动态注册方式特点:在代码中进行注册后,当应用程序关闭后,就不再进行监听。

    下面是具体的例子:

     MainActivity.java

  • package com.android.broadcast;  
  •  
  • import android.app.Activity;  
  • import android.content.Intent;  
  • import android.content.IntentFilter;  
  • import android.os.Bundle;  
  • import android.view.View;  
  • import android.view.View.OnClickListener;  
  • import android.widget.Button;  
  •  
  • public class MainActivity extends Activity{  
  •     //定义Action常量  
  •     protected static final String ACTION = "com.android.broadcast.RECEIVER_ACTION";  
  •     private Button btnBroadcast;  
  •     private Button registerReceiver;  
  •     private Button unregisterReceiver;  
  •     private MyReceiver receiver;  
  •     @Override 
  •     public void onCreate(Bundle savedInstanceState){  
  •         super.onCreate(savedInstanceState);  
  •         setContentView(R.layout.main);  
  •         btnBroadcast=(Button)findViewById(R.id.btnBroadcast);  
  •         //创建事件监听器  
  •         btnBroadcast.setOnClickListener(new OnClickListener(){  
  •             @Override 
  •             public void onClick(View v){  
  •                 Intent intent=new Intent();  
  •                 intent.setAction(ACTION);  
  •                 sendBroadcast(intent);  
  •             }  
  •         });  
  •           
  •         registerReceiver=(Button)findViewById(R.id.btnregisterReceiver);  
  •         //创建事件监听器  
  •         registerReceiver.setOnClickListener(new OnClickListener(){  
  •             @Override 
  •             public void onClick(View v){  
  •                 receiver=new MyReceiver();  
  •                 IntentFilter filter=new IntentFilter();  
  •                 filter.addAction(ACTION);  
  •                 //动态注册BroadcastReceiver  
  •                 registerReceiver(receiver, filter);  
  •             }  
  •         });  
  •           
  •         unregisterReceiver=(Button)findViewById(R.id.btnunregisterReceiver);  
  •         //创建事件监听器  
  •         unregisterReceiver.setOnClickListener(new OnClickListener(){  
  •             @Override 
  •             public void onClick(View v){  
  •                 //注销BroadcastReceiver  
  •                 unregisterReceiver(receiver);  
  •             }  
  •         });  
  •     }  
  •  在“com.android.broadcast”包中定义一个MyReceiver类,继承于BroadcastReceiver,覆盖onReceive()方法。

    MyReceiver.java

  • package com.android.broadcast;  
  •  
  • import android.content.BroadcastReceiver;  
  • import android.content.Context;  
  • import android.content.Intent;  
  • import android.util.Log;  
  •  
  • public class MyReceiver extends BroadcastReceiver{  
  •     //定义日志标签  
  •     private static final String TAG = "Test";  
  •     @Override 
  •     public void onReceive(Context context, Intent intent){  
  •         //输出日志信息  
  •         Log.i(TAG, "MyReceiver onReceive--->");  
  •     }  
  • }  
  • main.xml

  • <?xml version="1.0" encoding="utf-8"?> 
  • <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
  •     android:orientation="vertical" 
  •     android:layout_width="fill_parent" 
  •     android:layout_height="fill_parent" 
  •     > 
  •     <Button 
  •         android:id="@+id/btnBroadcast" 
  •         android:layout_width="match_parent" 
  •         android:layout_height="wrap_content" 
  •         android:text="发送广播" 
  •         /> 
  •     <Button 
  •         android:id="@+id/btnregisterReceiver" 
  •         android:layout_width="match_parent" 
  •         android:layout_height="wrap_content" 
  •         android:text="注册广播接收器" 
  •         /> 
  •     <Button 
  •         android:id="@+id/btnunregisterReceiver" 
  •         android:layout_width="match_parent" 
  •         android:layout_height="wrap_content" 
  •         android:text="注销广播接听器" 
  •         /> 
  • </LinearLayout> 
  • 效果图:

     

    ①当我们首先点击按钮的时候,因为程序没有注册BraodcastReceiver,所以LogCat没有输出任何信息。

    ②当我们先点击再点击按钮的时候,这时程序会动态的注册BraodcastReceiver,之后会调用onReceive()方法,LogCat输出信息如下:

     

     ③当我们点击按钮的时候,这时程序会注销BraodcastReceiver,再点击,LogCat没有输出任何信息。

    三.BroadcastReceiver 的生命周期

       一个BroadcastReceiver 对象只有在被调用onReceive(Context, Intent)的才有效的,当从该函数返回后,该对象就无效的了,结束生命周期。

     

    本文出自 “IT的点点滴滴” 博客,请务必保留此出处http://liangruijun.blog.51cto.com/3061169/655885

    1 楼 anyang763 2011-11-24  
     

        
    [2] 获取在运行的服务
        来源: 互联网  发布时间: 2014-02-18
    获取正在运行的服务
    package com.jf.getservice;
    
    import java.util.Iterator;
    import java.util.List;
    
    import android.app.Activity;
    import android.app.ActivityManager;
    import android.app.ActivityManager.RunningServiceInfo;
    import android.app.Service;
    import android.content.ComponentName;
    import android.content.Context;
    import android.os.Bundle;
    
    public class getRunningServicesInfo extends Activity {
        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            getRunningServicesInfo(this);
        }
    
        //RunningServicesInfo 
                public static String getRunningServicesInfo(Context context) { 
         
    
                        StringBuffer serviceInfo = new StringBuffer(); 
                        final ActivityManager activityManager = (ActivityManager) context 
                                        .getSystemService(Context.ACTIVITY_SERVICE); 
                        List<RunningServiceInfo> services = activityManager.getRunningServices(100); 
    
                        Iterator<RunningServiceInfo> l = services.iterator(); 
                        while (l.hasNext()) { 
                                RunningServiceInfo si = (RunningServiceInfo) l.next(); 
                                serviceInfo.append("pid: ").append(si.pid); 
                                serviceInfo.append("\nprocess: ").append(si.process); 
                                serviceInfo.append("\nservice: ").append(si.service); 
                                serviceInfo.append("\ncrashCount: ").append(si.crashCount); 
                                serviceInfo.append("\nclientCount: ").append(si.clientCount); 
                                serviceInfo.append("\nactiveSince: ").append(si.activeSince); 
                                serviceInfo.append("\nlastActivityTime: ").append(si.lastActivityTime); 
                                serviceInfo.append("\n\n"); 
                                
                        } 
                        System.out.println(serviceInfo.toString());
                        return serviceInfo.toString(); 
                } 
    }

     


        
    [3] Papago 领航破解过程
        来源: 互联网  发布时间: 2014-02-18
    Papago 导航破解过程
    一.必要知识
    对汇编语言有所了解.我其实也没用过arm汇编,.但是因为有80x86的经验.对于arm指令看10分钟也就会了.
    对android程序编写有一定了解。掌握程序加载执行流程。
    对函数调用流程有所了解.因为papago主体用的是gnu c++写的,所以symbol表比较清楚。很容易对照判别。而且对于arm elf程序函数的参数传递和寻址要有一定了解才能更好的破解。有破解经验更好
      二.实用工具。
           本来最好是在linux下。符合android环境。但是我破解多半是windows程序……linux大半不用破解……所以这里用的都是windows工具
      1.不用说 IDA PRO…大名鼎鼎。我们都用它。
      2.Ultraedit。恩。还行吧。任何一个hex editor都可以。
      3.Baksmali 反编译dex
      4.Gdb和strace备用
      5.电脑和人脑
      三.破解过程
      1.初步分析
      由于android出来不久,相应的加密加壳程序基本不存在。所以相对来说比较方便静态反编译。但是同样。动态跟踪程序也太少。Android gdb也不支持调试没有-g编译的代码。所以主要以静态反编译破解分析为主。
      加密原理,按照dopod惯例,绑定IMEI.所以从IMEI函数入手。
      首先把下载的dopod navigator.apk用winrar等直接解压缩。可以看到class.dex和libpapago.so,libpapago.so高达    2M。而class.dex 不到100k。确定是以JNI为主体的结构。那么加密判断是在java中呢还是c中,还不确定。
      拿出baksmali.进行分析。反编译class.dex,得到编译文件。开始分析。
      Sorry。我这台电脑没有保存smali文件。就不细说了。看activity和JNI class可以看到。IMEI是由java获取。  (BTW..那个函数居然叫JNIGetIMEI,我还以为是java从JNI得到IMEI。纳闷半天,还以为papago这么厉害能从native c或得IMEI,后来才发现是java从telephony类获取IME保存到C中),找遍了整个class.dex,再也没发现任何IMEI相关的判断。所以。基本判断主体是在libpapago中。

        
    最新技术文章:
    ▪Android开发之登录验证实例教程
    ▪Android开发之注册登录方法示例
    ▪Android获取手机SIM卡运营商信息的方法
    ▪Android实现将已发送的短信写入短信数据库的...
    ▪Android发送短信功能代码
    ▪Android根据电话号码获得联系人头像实例代码
    ▪Android中GPS定位的用法实例
    ▪Android实现退出时关闭所有Activity的方法
    ▪Android实现文件的分割和组装
    ▪Android录音应用实例教程
    ▪Android双击返回键退出程序的实现方法
    ▪Android实现侦听电池状态显示、电量及充电动...
    ▪Android获取当前已连接的wifi信号强度的方法
    ▪Android实现动态显示或隐藏密码输入框的内容
    ▪根据USER-AGENT判断手机类型并跳转到相应的app...
    ▪Android Touch事件分发过程详解
    ▪Android中实现为TextView添加多个可点击的文本
    ▪Android程序设计之AIDL实例详解
    ▪Android显式启动与隐式启动Activity的区别介绍
    ▪Android按钮单击事件的四种常用写法总结
    ▪Android消息处理机制Looper和Handler详解
    ▪Android实现Back功能代码片段总结
    ▪Android实用的代码片段 常用代码总结
    ▪Android实现弹出键盘的方法
    ▪Android中通过view方式获取当前Activity的屏幕截...
    ▪Android提高之自定义Menu(TabMenu)实现方法
    ▪Android提高之多方向抽屉实现方法
    ▪Android提高之MediaPlayer播放网络音频的实现方法...
    ▪Android提高之MediaPlayer播放网络视频的实现方法...
    ▪Android提高之手游转电视游戏的模拟操控
     


    站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3