我正在尝试使用ActivityLifecycleCallbacks自动捕获和记录Android生命周期事件,但至少可以说这个问题的文档很少:
public void registerActivityLifecycleCallbacks (Application.ActivityLifecycleCallbacks callback)
Run Code Online (Sandbox Code Playgroud)
我不想扩展Activity类或覆盖现有的生命周期方法(onCreate,onResume等等).我希望有一个单独的类来监听这些事件并采取相应的行动.
有没有人有这方面的经验,或者链接到良好的文档或教程如何工作?具体来说,如何注册ActivityLifecycleCallbacks,以及如何处理它们?
我正在整合由两个不同的人编写的代码,并注意到将一个String值转换为Long已经以两种不同的方式完成了.
编码器#1做到了这一点:
String strId = "12345678";
...
Long lId = new Long(strId);
Run Code Online (Sandbox Code Playgroud)
编码器#2做到了这一点:
String strId = "12345678";
...
Long lId = Long.valueOf(strId);
Run Code Online (Sandbox Code Playgroud)
从功能上讲,代码的运行方式完全相同.每个位周围都有一个try/catch块来处理NumberFormatException抛出的任何内容.传入的字符串值是一个8位数字符串,表示一个小数:"12345678"在两种情况下都正确地转换为Long.
在构造函数中传递字符串和使用Long.valueOf()之间是否存在任何功能差异?我在这里检查了构造函数doc:
以及valueOf()的文档:
Long.valueOf(java.lang.String中)
据我所知,他们都调用parseLong()所以使用哪个并不重要.我只是想确保自己不会在未来的某些奇怪行为中做好准备.另外,哪种风格比其他风格更"正确"(哈哈)?
所以我从经验中知道从cmd.exe运行有效程序并检查%errorlevel%将返回0:
C:\>dir logo.bmp
Volume in drive C has no label.
Volume Serial Number is 5283-A7A2
Directory of C:\
05/22/2008 12:43 PM 1,440,054 logo.bmp
1 File(s) 1,440,054 bytes
0 Dir(s) 71,723,995,136 bytes free
C:\>echo %errorlevel%
0
Run Code Online (Sandbox Code Playgroud)
同样,尝试执行不存在的命令然后检查%errorcode%给了我9009:
C:\>idontexist.exe
'idontexist.exe' is not recognized as an internal or external command,
operable program or batch file.
C:\>echo %errorlevel%
9009
Run Code Online (Sandbox Code Playgroud)
我多年来一直在编写批处理脚本,他们一直都是这样做的.但是,有人提出了有关此技术的兼容性(向前和向后)的问题,我找不到Microsoft的任何官方文档,实际上在找不到文件或程序时将9009定义为错误级别.我最近的是这个网站(http://msdn.microsoft.com/en-us/library/ms681381(v=vs.85).aspx),不幸的是,它列出了9009作为DNS错误.
有谁知道微软记录这种行为的位置?
所以在一些罕见的情况下,我看到"尝试编写只读数据库"的消息,我无法弄清问题所在.我将从我的logcat中的堆栈跟踪开始...正如您从时间戳中看到的那样,我在尝试写入之前仅检查了db.isReadOnly()1ms.(isOpen = true,readOnly = false)
01-29 13:47:49.115: D/AWT(11055): #479.Got writable database (230537815): isOpen: (true) isReadOnly: (false) inTransaction: (false)
01-29 13:47:49.116: D/AWT(11055): #479.in transaction: Got writable database (230537815): isOpen: (true) isReadOnly: (false) inTransaction: (true)
01-29 13:47:49.116: E/SQLiteLog(11055): (1032) statement aborts at 15: [INSERT INTO Events(col1,col2,col3,col4) VALUES (?,?,?,?)]
01-29 13:47:49.117: E/SQLiteDatabase(11055): Error inserting data="scrubbed"
01-29 13:47:49.117: E/SQLiteDatabase(11055): android.database.sqlite.SQLiteReadOnlyDatabaseException: attempt to write a readonly database (code 1032)
01-29 13:47:49.117: E/SQLiteDatabase(11055): at android.database.sqlite.SQLiteConnection.nativeExecuteForLastInsertedRowId(Native Method)
01-29 13:47:49.117: E/SQLiteDatabase(11055): at android.database.sqlite.SQLiteConnection.executeForLastInsertedRowId(SQLiteConnection.java:780)
01-29 13:47:49.117: E/SQLiteDatabase(11055): at android.database.sqlite.SQLiteSession.executeForLastInsertedRowId(SQLiteSession.java:788) …Run Code Online (Sandbox Code Playgroud) 是否可以使用Chrome开发工具远程调试器获取打开窗口的屏幕截图?
例如,我正在连接到远程调试端口,我有这个代码弹出一个空窗口:
private void sendWindowPop(int width, int height) throws
IOException {
hsc.send("{\"method\": \"Runtime.evaluate\", \"id\": "
+ hsc.nextInt()
+ ", \"params\": {"
+ "\"expression\":
\"window.open('about:blank','name','toolbar=0,scrollbars=0,"
+ "location=0,status=0,menubar=0,resizable=0,width="
+ width
+ ",height="
+ height
+ "');\""
+ "}}");
Run Code Online (Sandbox Code Playgroud)
(hsc是我在http:// localhost:9222上与调试器的连接)
然后,我用这个加载我的目标网址:
private void loadPage(String uriString) throws IOException {
hsc.send("{\"method\": \"Page.open\", \"id\": " +
hsc.nextInt() + ", \"params\": {\"url\": \"" + uriString + "\"}}");
hsc.waitFor(ChromeNotifications.PAGE_LOADEVENTFIRED, DEFAULT_TIMEOUT_MILLIS);
}
Run Code Online (Sandbox Code Playgroud)
上面的代码工作正常,首先弹出一个窗口,然后加载URL.理想情况下,我想要做的下一件事是获取加载的网页的屏幕截图.现在,这些浏览器窗口会弹出一个Xvfb虚拟桌面,我可以使用ImageMagick的导入工具来获取目标窗口的屏幕截图,但前提是它位于前台.
这是一个问题,因为此应用程序旨在与多个窗口并行运行到虚拟桌面中.任何与我的目标窗口重叠的窗口都会给我一个黑色截图,因为Xfvb只呈现可见的内容.
我还查看了API参考,chrome.tabs.captureVisibleTab.那里没有运气,它没有捕捉到不可见的东西.
有没有办法,使用远程调试器,抓取打开窗口的屏幕截图?
(供参考,我的ImageMagick命令用于导入是这个)
DISPLAY=:0.0 import -window "Google - Chromium" screenshot.png …Run Code Online (Sandbox Code Playgroud) java debugging google-chrome google-chrome-extension google-chrome-devtools
我正在为 Android 开发第三方库,需要能够判断我是作为具有所需权限的特权进程运行,还是生活在具有 AndroidManifest.xml 中定义的受限权限的隔离进程中文件:
<service android:name="mySandboxedService" android:permission="com.android.chrome.permission.CHILD_SERVICE" android:exported="false" android:process=":sandboxed_process0" android:isolatedProcess="true" />
Run Code Online (Sandbox Code Playgroud)
原因是我正在尝试做的某些事情,例如获取正在运行的应用程序进程(以及其他各种事情)的数量,如果它们被隔离,则会抛出 RuntimeException。如果不是作为隔离进程运行,此代码将成功运行,但如果进程被隔离,则会抛出 RTE:
ActivityManager aM = (ActivityManager) context.getSystemService(android.content.Context.ACTIVITY_SERVICE);
List<ActivityManager.RunningAppProcessInfo> l = null;
try {
l = aM.getRunningAppProcesses();
} catch (RuntimeException e) {
Log.w(LOGTAG, "Isolated process not allowed allowed to call getRunningAppProcesses, cannot get number of running apps.");
}
Run Code Online (Sandbox Code Playgroud)
从我的日志:
java.lang.SecurityException: Isolated process not allowed to call getRunningAppProcesses
Run Code Online (Sandbox Code Playgroud)
有谁知道我可以检查我当前进程以查看它是孤立的还是特权的方法?我在这里检查了 Android服务文档,它没有提供太多信息。
我的最终目标是从主特权线程初始化我的应用程序,然后忽略来自可能创建的各种沙盒进程的所有启动调用。我不想在那些中运行,但我的钩子在 Application.onCreate 中并且每个进程都会被调用,无论是否被沙箱化。
我已经考虑过将这些检查之一添加到我的初始化中并在抛出 RTE 时捕获 RTE 的想法。但是如果有一个公共 API,我宁愿使用它。
java android android-manifest android-service android-permissions
我使用的是Android Studio 2.3.3,Android SDK工具v26.0.2和HAXM模拟器6.2.1.
编辑(更新2017/11/10):还尝试使用Android Studio 3.0,Android SDK工具27.0.1,HAXM模拟器6.2.1,x86 Google Play英特尔API 27图像修订版1.
我下载了Android 8.0(O,API级别26,修订版2)平台并创建了一个新的模拟器:
创建 - >电话 - > Nexus 5X,支持Play商店 - > Image x86 API 26(Google Play),标准设置:

启动模拟器后,我在通知栏中收到一条消息,告诉我"不支持的虚拟SD卡.此设备不支持此虚拟SD卡.点击以支持的格式设置."

我这样做,并选择内部或外部存储,然后我收到错误:

10-09 13:31:59.786 2984-2984 E/StorageSettings: Failed to partition
java.lang.IllegalStateException: command '10 volume partition disk:253,48 public' failed with '400 10 Command failed'
Run Code Online (Sandbox Code Playgroud)
完整错误及其周围的一切:
10-09 13:31:58.397 1506-1594 E/TaskPersister: File error accessing recents directory (directory doesn't exist?).
10-09 13:31:58.566 2984-3021 D/EGL_emulation: eglMakeCurrent: 0xa1a99fe0: ver 2 0 (tinfo 0xa1d7f920)
10-09 13:31:58.608 1356-1356 D/gralloc_ranchu: gralloc_alloc: Creating ashmem …Run Code Online (Sandbox Code Playgroud) 我正在使用git log,以便在两个分支之间生成差异.我正在使用的确切命令是:
git log --left-right --graph --cherry-pick --oneline sourceBranch...targetBranch
Run Code Online (Sandbox Code Playgroud)
我想知道的是我是否可以根据提交消息排除一些日志条目.例如,我们的测试自动化团队提交的所有提交都包含一个特定的标识符,我们称之为TEST_AUTO.目前,我的差异输出看起来像这样:
> 1e31b8x Merge pull request #1225 in base/project from feature/ABCD-1111 to master
|\
| > b2f0dfx [ABCD-1111] rework help tour // fixes
| > 270072x [ABCD-1111] rework help tour // merge fixes
| > 98ffeax [ABCD-1111] rework help tour // merge fixes
| > ff2e25x Merge branch 'master' into feature/ABCD-1111-rework-help-tour
| |\
| > | f0daf2x [ABCD-1111] rework help tour // new menu
| > | …Run Code Online (Sandbox Code Playgroud) 我有一个Android应用程序,它执行此操作:
PackageManager pm = getApplicationContext().getPackageManager();
Intent browserIntent = new Intent();
browserIntent.setAction(Intent.ACTION_VIEW);
browserIntent.addCategory(Intent.CATEGORY_BROWSABLE);
browserIntent.setData(Uri.parse("http://www.google.com"));
ResolveInfo resolveInfo = pm.resolveActivity(browserIntent, PackageManager.MATCH_DEFAULT_ONLY);
try {
String browserType = nutent.activityInfo.packageName;
} catch (NullPointerException npe) {
npe.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)
我已经在4种不同的手机和许多不同的仿真器配置上进行了测试.所有这些都很好.但我正在从野外部署的应用程序中获取崩溃报告,因为resolveInfo有时为null.
立即修复是在崩溃我的应用程序之前捕获NPE并处理它(如上所述).但是我已经尝试了几天自己重现这一点而不能.在安装了单个默认浏览器的模拟器上,它解析为com.android.browser.BrowserActivity:
ResolveInfo{411ef228 com.android.browser.BrowserActivity p=0 o=0 m=0x208000}
Run Code Online (Sandbox Code Playgroud)
同样,在安装了多个浏览器的手机上,这有点不同......对于com.android.internal.app.ResolverActivity:
ResolveInfo{415c13b8 com.android.internal.app.ResolverActivity p=0 o=0 m=0x0}
Run Code Online (Sandbox Code Playgroud)
该resolveActivity()文档在此状态:
返回ResolveInfo,其中包含被确定为最佳操作的最终活动意图.如果未找到匹配的活动,则返回null.如果找到多个匹配活动且没有默认设置,则返回包含其他内容的ResolveInfo,例如活动解析程序.
所以我已经介绍了第一个场景,即被确定为最佳动作的活动意图.最后一个场景,即没有默认操作的多个匹配活动,返回ResolverActivity.
我真的想重现resolveActivity()的场景,在请求URL的活动时给我一个null.有没有人知道如何在没有设备生根的情况下完成这项工作?
我有一个Java lambda流,它根据一些基本过滤来解析文件并将结果存储到一个集合中.
我只是在学习lambdas,所以如果这是非常糟糕的话,请耐心等待我.但请随意指出我的错误.
对于给定的文件:
#ignored
this
is
#ignored
working
fine
Run Code Online (Sandbox Code Playgroud)
代码:
List<String> matches;
Stream<String> g = Files.lines(Paths.get(givenFile));
matches = g.filter(line -> !line.startsWith("#"))
.collect(Collectors.toList());
["this", "is", "working", "fine"]
Run Code Online (Sandbox Code Playgroud)
现在,我将如何将忽略的行收集到同一个流中的第二个列表中?就像是:
List<String> matches;
List<String> ignored; // to store lines that start with #
Stream<String> g = Files.lines(Paths.get(exclusionFile.toURI()));
matches = g.filter(line -> !line.startsWith("#"))
// how can I add a condition to throw these
// non-matching lines into the ignored collection?
.collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
我意识到打开一个新的流,稍微改变一下逻辑并且.collect()容易被忽略的行是非常简单的.但是,如果我可以在一个流中完成所有操作,我不想两次遍历此文件.
java ×6
android ×5
batch-file ×1
callback ×1
cmd ×1
coding-style ×1
debugging ×1
errorlevel ×1
git ×1
git-log ×1
lambda ×1
lifecycle ×1
long-integer ×1
resolver ×1
sqlite ×1