当前位置:首页 » 安卓系统 » android反射变量

android反射变量

发布时间: 2024-10-15 19:00:24

Ⅰ Android 11 反射屏蔽机制绕过方法

Android 11 apk开发过程中。使粗脊大用 反射机制 调用方法失败,总是报错(blocked, reflection, denied),被拒绝,下面是解决方法

步骤一:In your root build.gradle:

步骤岩竖二野败:In your library/build.gradle add:

Ⅱ android 可以反射到另一个应用里面的类么

一个app不可以直接访问另一个app的类。如果非要实现进程间通信,可以通过aidl做。可以考虑采用jar包的方式,将app B 打成jar文件 导入到 app A 中 就可以实现了。在应用中可以反射到类似framework里面的 diaolog activity这些类,是因为import了这些类,所以在这些包以jar的形式编译到应用。相反,是因为以jar的形式编译到了应用,才有了import。如果没有jar,就import不了。

Ⅲ android开发api选哪个版本合适

对于SDK版本,有两种选择 如果你开发技术比较高兼容的最全面可以考虑使用Android 1.5 API Level为3的,高版本API使用java反射调用 如果考虑较简单可以使用Android 2.0或更高版本,发布时和API兼容性无关的可以设置androidmanifest.xml中的minSDK...

Ⅳ android 什么是反射

-什么是反射机制?

反射机制是在运行状态中,对于任意一个类(Class),都能够知道这个类的所有属性和方法(Method);对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。

-反射机制能做什么?

主要功能:调用隐藏API,即标注了 @hide 的方法。

其他:

在运行时判断任意一个对象所属的类;

在运行时构造任意一个类的对象;

在运行时判断任意一个类所具有的成员变量和方法;

在运行时调用任意一个对象的方法;

生成动态代理。

-注意事项?

Google之所以要将一些API隐藏(指加上@hide标记的public类、方法或常量)是有原因的。其中很大的原因就是Android系统本身还在不断的进化发展中。从1.0、1.1到现在即将问世的Android2.3.4。这些隐藏的API本身可能是不稳定的,所以,使用隐藏API,意味着程序更差的兼容性。

如果要我给出建议的话,最好还是不要使用隐藏的API。不过有时为了实现Android应用某些特殊的功能或者效果,隐藏的API往往能发挥意想不到的作用。这些API具体能做些什么事,我就不在这里举例了。正好,如果你不知道隐藏API能做什么的话,那么还是尽早放弃使用它们吧……

引用内容自:

ke.xsoftlab.net/view/209.html

blog.sina.com.cn/s/blog_5da93c8f0101e1yj.html

Ⅳ android 怎么获取应用安装包的大小

网上找了一下有两种方法:

1、直接拿到data目录下对应的包,然后用File.length()方法获得。然后会发现和设置里显示的大小不同。

2、通过反射调用设置里源码的方法获得PackageStats类的实例。

两种方法都不想用...

后来自己找到解决办法:

PackageManager类有个getPackageSizeInfo方法如下:

复制代码 代码如下:

public abstract void getPackageSizeInfo(String packageName,

IPackageStatsObserver observer);


只是这个方法是hide的。

自己编译一下的android2.3的Framework框架,把jar包拷出来,只需要把框架导入到library,设置在默认的android的lib之上遍可以优先使用自己编译的框架了,其实也就是让自己应用层能调用框架中的接口。

framework下载:点击此处

下载好后,通过添加lib后把classes.jar添加到此lib中,如图:

下面就是直接使用方法了。

代码如下:

pm.getPackageSizeInfo(packageInfo.packageName,

new IPackageStatsObserver.Stub() {

public void onGetStatsCompleted(PackageStats stats,

boolean succeeded) {

Log.v("King", stats.codeSize);

Log.v("King", stats.dataSize);

Log.v("King", stats.cacheSize);

}

});


第一个参数是包名,想必大家都能拿到。

第二个参数是实现AIDL生成的JAVA接口的匿名内部类。在回调方法里即可处理程序大小数据。

stats.codeSize:应用程序大小

stats.dataSize:数据大小

stats.cacheSize:缓存大小

一般大家可能都是用listView去显示每个应用的大小,而调用getPackageSizeInfo方法是不能立刻拿到值的,所以要和其他数据异步显示。


可以通过handler讲数据发送出去后,然后调用Adapter的notifyDataSetChanged()方法更新显示应用大小。

也许你还想点击每一项可以可以直接跳转到设置里的应用管理界面,而不自己去写卸载、清除缓存等方法。设置源码的方法如下,可以搬过来照样用:

代码如下:

Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS,Uri.fromParts("package",包名 ,null));

// start new activity to display extended information

startActivityForResult(intent, 1);

Ⅵ Android系统怎么利用利用Java反射技术阻止通过按钮关闭对话框(AlertDialog)

众所周知,AlertDialog类用于显示对话框。关于AlertDialog的基本用法在这里就不详细介绍了,网上有很多,读者可以自己搜索。那么本文要介绍的是如何随心所欲地控制AlertDialog。
现在我们来看看第一个需求:如果某个应用需要弹出一个对话框。当单击“确定“按钮时完成某些工作,如果这些工作失败,对话框不能关闭。而当成功完成工作后,则关闭对话框。当然,无论何程度情况,单击“取消”按钮都会关闭对话框。
这个需求并不复杂,也并不过分(虽然我们可以自己弄个Activity来完成这个工作,也可在View上自己放按钮,但这显示有些大炮打蚊子了,如果对话框上只有一行文本,费这么多劲太不值了)。但使用过AlertDialog的读者都知道,无论单击的哪个按钮,无论按钮单击事件的执行情况如何,对话框是肯定要关闭的。也就是说,用户无法控制对话框的关闭动作。实际上,关闭对话框的动作已经在Android SDK写死了,并且未给使用者留有任何接口。但我的座右铭是“宇宙中没有什么是不能控制的”。
既然要控制对放框的关闭行为,首先就得分析是哪些类、哪些代码使这个对话框关闭的。进入AlertDialog类的源代码。在AlertDialog中只定义了一个变量:mAlert。这个变量是AlertController类型。AlertController类是Android的内部类,在com.android.internal.app包中,无法通过普通的方式访问。也无法在Eclipse中通过按Ctrl键跟踪进源代码。但可以直接在Android源代码中找到AlertController.java。我们再回到AlertDialog类中。AlertDialog类实际上只是一个架子。象设置按钮、设置标题等工作都是由AlertController类完成的。因此,AlertController类才是关键。
找到AlertController.java文件。打开后不要感到头晕哦,这个文件中的代码是很多地。不过这么多代码对本文的主题也没什么用处。下面就找一下控制按钮的代码。
在AlertController类的开头就会看到如下的代码: View.OnClickListener mButtonHandler = new View.OnClickListener() {
public void onClick(View v) {
Message m = null ;
if (v == mButtonPositive && mButtonPositiveMessage != null ) {
m = Message.obtain(mButtonPositiveMessage);
} else if (v == mButtonNegative && mButtonNegativeMessage != null ) {
m = Message.obtain(mButtonNegativeMessage);
} else if (v == mButtonNeutral && mButtonNeutralMessage != null ) {
m = Message.obtain(mButtonNeutralMessage);
}
if (m != null ) {
m.sendToTarget();
} // Post a message so we dismiss after the above handlers are executed
mHandler.obtainMessage(ButtonHandler.MSG_DISMISS_DIALOG, mDialogInterface)
.sendToTarget();
}
};
从这段代码中可以猜出来,前几行代码用来触发对话框中的三个按钮( Positive 、 Negative 和 Neutral )的单击事件,而最后的代码则用来关闭对话框(因为我们发现了 MSG_DISMISS_DIALOG 、猜出来的)。
mHandler.obtainMessage(ButtonHandler.MSG_DISMISS_DIALOG, mDialogInterface)
.sendToTarget(); 上面的代码并不是直接来关闭对话框的,而是通过一个 Handler 来处理,代码如下:
private static final class ButtonHandler extends Handler {
// Button clicks have Message.what as the BUTTON{1,2,3} constant
private static final int MSG_DISMISS_DIALOG = 1 ;

private WeakReference < DialogInterface > mDialog; public ButtonHandler(DialogInterface dialog) {
mDialog = new WeakReference < DialogInterface > (dialog);
} @Override
public void handleMessage(Message msg) {
switch (msg.what) {

case DialogInterface.BUTTON_POSITIVE:
case DialogInterface.BUTTON_NEGATIVE:
case DialogInterface.BUTTON_NEUTRAL:
((DialogInterface.OnClickListener) msg.obj).onClick(mDialog.get(), msg.what);
break ;

case MSG_DISMISS_DIALOG:
((DialogInterface) msg.obj).dismiss();
}
}
}
从上面代码的最后可以找到 ((DialogInterface) msg.obj).dismiss();。现在看了这么多源代码,我们来总结一下对话框按钮单击事件的处理过程。在AlertController处理对话框按钮时会为每一个按钮添加一个onclick事件。而这个事件类的对象实例就是上面的mButtonHandler。在这个单击事件中首先会通过发送消息的方式调用为按钮设置的单击事件(也就是通过setPositiveButton等方法的第二个参数设置的单击事件),在触发完按钮的单击事件后,会通过发送消息的方式调用dismiss方法来关闭对话框。而在AlertController类中定义了一个全局的mHandler变量。在AlertController类中通过ButtonHandler类来对象来为mHandler赋值。因此,我们只要使用我们自己Handler对象替换ButtonHandler就可以阻止调用dismiss方法来关闭对话框。下面先在自己的程序中建立一个新的ButtonHandler类(也可叫其他的名)。
class ButtonHandler extends Handler
{ private WeakReference < DialogInterface > mDialog; public ButtonHandler(DialogInterface dialog)
{
mDialog = new WeakReference < DialogInterface > (dialog);
} @Override
public void handleMessage(Message msg)
{
switch (msg.what)
{ case DialogInterface.BUTTON_POSITIVE:
case DialogInterface.BUTTON_NEGATIVE:
case DialogInterface.BUTTON_NEUTRAL:
((DialogInterface.OnClickListener) msg.obj).onClick(mDialog
.get(), msg.what);
break ;
}
}
} 我们可以看到,上面的类和AlertController中的ButtonHandler类很像,只是支掉了switch语句的最后一个case子句(用于调用dismiss方法)和相关的代码。
下面我们就要为AlertController中的mHandler重新赋值。由于mHandler是private变量,因此,在这里需要使用Java的反射技术来为mHandler赋值。由于在AlertDialog类中的mAlert变量同样也是private,因此,也需要使用同样的反射技术来获得mAlert变量。代码如下:
先建立一个 AlertDialog 对象
AlertDialog alertDialog = new AlertDialog.Builder( this )
.setTitle( " abc " )
.setMessage( " content " )
.setIcon(R.drawable.icon)
.setPositiveButton( “确定”,
new OnClickListener()
{
@Override
public void onClick(DialogInterface dialog,
int which)
{ }
}).setNegativeButton( " 取消 " , new OnClickListener()
{ @Override
public void onClick(DialogInterface dialog, int which)
{
dialog.dismiss();
}
}).create()
上面的对话框很普通,单击哪个按钮都会关闭对话框。下面在调用 show 方法之前来修改一个 mHandler 变量的值, OK ,下面我们就来见证奇迹的时刻。 try
{

Field field = alertDialog1.getClass().getDeclaredField( " mAlert " );
field.setAccessible( true );
// 获得mAlert变量的值
Object obj = field.get(alertDialog1);
field = obj.getClass().getDeclaredField( " mHandler " );
field.setAccessible( true );
// 修改mHandler变量的值,使用新的ButtonHandler类
field.set(obj, new ButtonHandler(alertDialog1));
}
catch (Exception e)
{
}
// 显示对话框
alertDialog.show(); 我们发现,如果加上try catch语句,单击对话框中的确定按钮不会关闭对话框(除非在代码中调用dismiss方法),单击取消按钮则会关闭对话框(因为调用了dismiss方法)。如果去了try…catch代码段,对话框又会恢复正常了。
虽然上面的代码已经解决了问题,但需要编写的代码仍然比较多,为此,我们也可采用另外一种方法来阻止关闭对话框。这种方法不需要定义任何的类。
这种方法需要用点技巧。由于系统通过调用dismiss来关闭对话框,那么我们可以在dismiss方法上做点文章。在系统调用dismiss方法时会首先判断对话框是否已经关闭,如果对话框已经关闭了,就会退出dismiss方法而不再继续关闭对话框了。因此,我们可以欺骗一下系统,当调用dismiss方法时我们可以让系统以为对话框已经关闭(虽然对话框还没有关闭),这样dismiss方法就失效了,这样即使系统调用了dismiss方法也无法关闭对话框了。
下面让我们回到AlertDialog的源代码中,再继续跟踪到AlertDialog的父类Dialog的源代码中。找到dismissDialog方法。实际上,dismiss方法是通过dismissDialog方法来关闭对话框的,dismissDialog方法的代码如下: private void dismissDialog() {
if (mDecor == null ) {
if (Config.LOGV) Log.v(LOG_TAG,
" [Dialog] dismiss: already dismissed, ignore " );
return ;
}
if ( ! mShowing) {
if (Config.LOGV) Log.v(LOG_TAG,
" [Dialog] dismiss: not showing, ignore " );
return ;
} mWindowManager.removeView(mDecor); mDecor = null ;
mWindow.closeAllPanels();
onStop();
mShowing = false ;

sendDismissMessage();
}
该方法后面的代码不用管它,先看 if(!mShowing){ … } 这段代码。这个 mShowing 变量就是判断对话框是否已关闭的。因此,我们在代码中通过设置这个变量就可以使系统认为对话框已经关闭,就不再继续关闭对话框了。由于 mShowing 也是 private 变量,因此,也需要反射技术来设置这个变量。我们可以在对话框按钮的单击事件中设置 mShowing ,代码如下:
try
{
Field field = dialog.getClass()
.getSuperclass().getDeclaredField(
" mShowing " );
field.setAccessible( true );
// 将mShowing变量设为false,表示对话框已关闭
field.set(dialog, false );
dialog.dismiss();}
catch (Exception e)
{}
将上面的代码加到哪个按钮的单击事件代码中,哪个按钮就再也无法关闭对话框了。如果要关闭对话框,只需再将 mShowing 设为 true 即可。要注意的是,在一个按钮里设置了 mShowing 变量,也会影响另一个按钮的关闭对话框功能,因此,需要在每一个按钮的单击事件里都设置 mShowing 变量的值。 本文来自CSDN博客,转载请标明出处: http://blog.csdn.net/nokiaguy/archive/2010/07/27/5770263.aspx

Ⅶ android.telephony.telephonymanager怎么反射调用

TelephonyManager tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
/**
* 返回电话状态
*
* CALL_STATE_IDLE 无任何状态时
* CALL_STATE_OFFHOOK 接起电话时
* CALL_STATE_RINGING 电话进来时
*/
tm.getCallState();
//返回当前移动终端的位置
CellLocation location=tm.getCellLocation();
//请求位置更新,如果更新将产生广播,接收对象为注册LISTEN_CELL_LOCATION的对象,需要的permission名称为ACCESS_COARSE_LOCATION。
location.requestLocationUpdate();

热点内容
android适应屏幕大小 发布:2024-10-15 21:11:26 浏览:556
java字符串号 发布:2024-10-15 21:07:48 浏览:41
数据库myd 发布:2024-10-15 21:04:41 浏览:457
东南大学c语言 发布:2024-10-15 21:03:22 浏览:867
视易收银系统服务器名称是什么 发布:2024-10-15 20:34:31 浏览:861
转账密码输错怎么办 发布:2024-10-15 20:33:43 浏览:349
用户名怎么配置 发布:2024-10-15 20:31:23 浏览:365
访问穿刺 发布:2024-10-15 20:21:20 浏览:298
页面访问升级中狼永久网页 发布:2024-10-15 20:16:12 浏览:122
iphone加密备忘录 发布:2024-10-15 20:14:38 浏览:179