小编use*_*372的帖子

在安全的Android锁定屏幕中使用FLAG_SHOW_WHEN_LOCKED和disableKeyguard()

上下文

最近,我一直在寻找可靠的方法来控制安全的Android Keyguard.主要是显示自定义锁屏.我知道谷歌已经声明平台没有正式支持自定义锁定屏幕,并且应该预期事情会破裂,但是,对于现有的API,我相信必须有办法实现这一点.我做了大约一周的研究,但仍然存在问题.假设已启用安全的Keyguard,到目前为止,我已实现了

  • WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED允许在屏幕上显示活动(窗口),将Keyguard放在后面,并防止所有不安全的操作.通知面板被禁用,完成活动将调出键盘.我在锁屏活动中实现了如下.

    @Override
    public void onAttachedToWindow() {
        window.addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
    }
    
    Run Code Online (Sandbox Code Playgroud)
  • KeyguardManager,KeyguardManager.KeyguardLock已弃用的类,但它们仍然一直工作到Jelly Bean.要做到这一点,我有一个Service处理两件事,拿着一个静态KeyguardManager和相关的对象,让它持有一个BroadcastReceiver接收Intent.ACTION_SCREEN_ONIntent.ACTION_SCREEN_OFF.(所有对象都已正确初始化)


对于 ScreenReceiver

public static synchronized void disableKeyguard() {
    if ( isLocked ) {
        if ( keyguardLock == null ) {
            keyguardLock = keyguardManager.newKeyguardLock(LOG_TAG);
        }
        keyguardLock.disableKeyguard();
        isLocked = false;
    }
}

public static synchronized void reenableKeyguard() {
    if ( !isLocked ) {
        if ( keyguardLock == null ) {
            keyguardLock = keyguardManager.newKeyguardLock(LOG_TAG);
        }
        keyguardLock.reenableKeyguard();
        keyguardLock …
Run Code Online (Sandbox Code Playgroud)

android android-intent

25
推荐指数
2
解决办法
2万
查看次数

地图上的75个标记 - >内存泄漏 - > OutOfMemoryException

我在谷歌地图上绘制大约80个标记时遇到问题.我正在使用Google Maps Android API v2.

标记的图标是动态的(时间变化).将标记添加到地图后,无法更改图标.因此,我必须删除所有标记并再次添加所有标记.

mMap.clear();
for (int i = 0; i < teams.length(); i++) {
    team = teams.get(i);
    point = new LatLng(tema.getLatitude(), team.getLongitude());

    MarkerOptions marker = new MarkerOptions().position(point).title(name).icon(BitmapDescriptorFactory.fromResource(team.getMarkerId())));
        mMap.addMarker(marker);
}
Run Code Online (Sandbox Code Playgroud)

多次执行此代码后(每分钟刷新一次),我得到一个OutOfMemoryExpcetion.

当使用较大的标记图标时,OutOfMemoryException会更快地抛出,因此我认为内存问题与图标位图有关,而该位图未正确回收.

我还想到,当将设备的旋转从横向更改为portait并返回时,会增加使用的堆内存.在GC之后,内存不会被释放.

有人知道我是否错误地添加了标记,或者我是否在Map API实现中遇到问题?


我尝试使用Google Map示例应用程序重现错误.在android-sdk/extras/google/google_play_services/samples/maps/src/com/example/mapdemo/MarkerDemoActivity.java标记演示中可以找到.加快测试速度我增加了创建的标记数量.

int numMarkersInRainbow = 12;
Run Code Online (Sandbox Code Playgroud)

改成

int numMarkersInRainbow = 100;
Run Code Online (Sandbox Code Playgroud)

现在启动演示应用程序,选择标记演示并将设备的旋转从纵向切换到横向并返回几次.

初始堆:

Heap size   Allocated  Free      %Used    #Objects
11,543 BM   9,898 MB   1,645 MB  85,75%   65.982
Run Code Online (Sandbox Code Playgroud)

在几个方向更改后堆积:

Heap size   Allocated  Free      %Used    #Objects
15,652 MB   11,337 MB  4,316 MB  72,43% …
Run Code Online (Sandbox Code Playgroud)

maps android out-of-memory google-maps-android-api-2

12
推荐指数
1
解决办法
2759
查看次数

应用升级期间是否清除了Android活动instanceState?

在活动的instanceState中,我们存储了Serializable(bundle.putSerializable).在Play商店的崩溃报告中,我们看到了以下堆栈跟踪:

Caused by: java.lang.ClassNotFoundException: o.?
at java.lang.Class.classForName(Class.java)
at java.lang.Class.forName(Class.java:308)
at android.os.Parcel$2.resolveClass(Parcel.java:2373)
at java.io.ObjectInputStream.readNewClassDesc(ObjectInputStream.java:1641)
at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:657)
at java.io.ObjectInputStream.readNewObject(ObjectInputStream.java:1782)
at java.io.ObjectInputStream.readNonPrimitiveContent(ObjectInputStream.java:761)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:1983)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:1940)
at android.os.Parcel.readSerializable(Parcel.java:2381)
Run Code Online (Sandbox Code Playgroud)

我们的代码被DexGuard混淆了.看起来Android能够序列化类但不能反序列化类.

我们目前可以想到的唯一原因是应用程序的升级(通过de Play商店).在版本之间,类被更改(因为Dexguard)使反序列化成为不可能.

所以,我的问题是:在升级应用程序期间,Android是否清除应用程序的所有instanceState?

serialization android instancestate

9
推荐指数
1
解决办法
156
查看次数

从应用程序到服务进行通信

我想从我的Android应用程序与我的Android服务进行通信.我有两个选择,但我不知道选择哪个:

  1. 在应用程序中注册服务
  2. 使用LocalBinder从应用程序连接到服务.

解决方案1

应用程序:

public class MyApplication extends Application {

    MyService myService;

    public void setMyService(MyService myService) {
        this.myService = myService;
    }

    public void testCallService(){
        myService.sendResponseApdu("test".getBytes());
    }
}
Run Code Online (Sandbox Code Playgroud)

和服务:

public class MyService extends HostApduService {

    @Override
    public void onCreate() {
        super.onCreate();
        ((MyApplication)getApplication()).setMyService(this);
    }

    @Override
    public byte[] processCommandApdu(byte[] commandApdu, Bundle extras) {
        return new byte[0];
    }

    @Override
    public void onDeactivated(int reason) {

    }
}
Run Code Online (Sandbox Code Playgroud)

要调用该服务,应用程序将使用对服务的引用.该服务是一项本地服务.(不是远程服务)这种方法是否适用于所有情况?

解决方案2

使用带有ServiceConnection的LocalService方法绑定到服务符合http://developer.android.com/reference/android/app/Service.html#LocalServiceSample上的示例

解决方案2将起作用.示例1也会起作用吗?与解决方案2相比,解决方案1的(dis)优势是什么?

service android

5
推荐指数
1
解决办法
407
查看次数

Spring Boot中的角色基础Json输出

是否可以JsonProperties根据定义的条件排除Spring Boot Rest调用的输出?(例如,用户的角色)

例:

public class Employee{

    @JsonProperty
    private String name;
    @JsonProperty
    private String fieldForManagerOnly;
    @JsonProperty
    private String fieldForEmployeeOnly;

}
Run Code Online (Sandbox Code Playgroud)

fieldForManagerOnly当用户拥有ROLE时,我希望在JSON输出中只有序列化manager.

我已经尝试了解决方案@JsonView(如Spring最新杰克逊集成改进中所述),但该解决方案非常有限,因为@JsonView绑定到一个控制器方法,我想只有一个控制器方法.

json spring-mvc jackson spring-boot

3
推荐指数
1
解决办法
805
查看次数