我想让我Service在前台跑步.我尝试使用此示例(请查看" 在前台运行服务 "部分),但startForeground()实际上并未显示我的通知.并没有抛出异常.为了使它显示,我需要使用NotificationManager像这里解释的那样.随着NotificationManager我的通知工作,但我不确定我Service的前景是在这个"无声"呼叫之后startForeground().
有什么不对?
编辑:我刚刚测试了这个应该演示的示例项目startForeground(),但它不起作用!我使用API v7.0,我在模拟器和真实设备(SE Xperia Neo)上测试了它.通知不会出现.
EDIT2:如果我试着打电话,setForeground()那我就收到了警告setForeground: ignoring old API call.
我也尝试使用这里startForegroundCompat()描述的,但效果绝对相同.我按照这里的描述检查我的服务是否是前台服务,我发现我的服务不是前台服务.ActivityManager.RunningServiceInfo
我有活动和服务.当Activity启动时,startService()即使Activity被销毁,它也会调用以使此服务处于活动状态,并bindService()与此服务进行通信.
bindService()返回true,mService.onBind()被调用,也ServiceConnection.onServiceConnected()被调用.一切都有效.
当我通过按Back键销毁我的Activity时,它会调用unbindService(),然后调用我的Activity mService.onUnbind().(我回来false了onUnbind().)
然后我重新开始这个活动,bindService()返回true,然后mService.onBind()是不叫!但也ServiceConnection.onServiceConnected()被召唤,一切都有效.
看起来Dalvik记得我onBind()上一次回来了什么,只是不再打电话onBind().当我再次破坏我的活动时,onUnbind()也不会被召唤.
我可以多次绑定和取消绑定此服务到我的Activity,但是在我通过解除绑定和调用来销毁Service之前,不会再调用这些方法stopService().
在文档中,我无法找到对此行为的任何解释.相反,这个数字表明,onBind()和onUnbind()应该叫每个客户绑定时间和取消绑定服务.此图可以在本开发指南的底部找到.
我已经看到了几个建议,但没有任何真正对我有用的东西.我只需要将文件复制到所需的目标目录.
比如说,从这个回答:
install_it.path = %{buildDir}
install_it.files += %{sourceDir}/settings.ini
INSTALLS += install_it
Run Code Online (Sandbox Code Playgroud)
变量%{buildDir}和%{sourceDir}应界定,以使这项工作.好吧,没问题%{sourceDir}:它只是..但我怎么能得到%{buildDir}?
EDIT1
说,我my_project这里有一个项目:
/path/to/my_project
因此,释放的构建路径是这样的:/path/to/my_project-build-Desktop-release,
调试构建路径是这样的: /path/to/my_project-build-Desktop-debug
我有文件要复制到目标目录: /path/to/my_project/copy_to_install_dir
因此,我希望在发布版本时/path/to/my_project/copy_to_install_dir将所有文件复制到/path/to/my_project-build-Desktop-release.而且,调试构建的方式相同.
我找不到包含完整目标路径的变量,即/path/to/my_project-build-Desktop-release用于调试构建.
以防万一:我使用Windows,但无论如何我正在寻找跨平台解决方案.
EDIT2
准确的解决方案,面向未来的读者:
install_it.path = $$OUT_PWD
install_it.files = copy_to_install_dir/*
INSTALLS += \
install_it
Run Code Online (Sandbox Code Playgroud) 我需要将文本追加到QPlainTextEdit不添加新行的文本,但是这两种方法appendPlainText(),并appendHtml()实际上增加了新的段落.
我可以手动执行以下操作QTextCursor:
QTextCursor text_cursor = QTextCursor(my_plain_text_edit->document());
text_cursor.movePosition(QTextCursor::End);
text_cursor.insertText("string to append. ");
Run Code Online (Sandbox Code Playgroud)
这是有效的,但如果它在追加之前我还需要保持在底部滚动.
我试图从Qt的源文件副本的逻辑,但我坚持就可以了,因为那里实际上QPlainTextEditPrivate是使用类,我找不到这样做没有它的方法:比如说,我没有看到的方法verticalOffset()在QPlainTextEdit.
实际上,这些来源包含许多奇怪的东西(至少在初看起来),我不知道如何实现它.
以下是源代码append():http://code.qt.io/cgit/qt/qt.git/tree/src/gui/widgets/qplaintextedit.cpp#n2763
我需要QLineEdit在表单上显示"浏览"按钮.当用户单击按钮时,QFileDialog应该打开,依此类推.
这很常见,但我找不到现成的解决方案.我期望在Qt Designer中有一些小部件QFileSelect,或类似的东西,但没有发现类似的东西.
我应该手工实施吗?或者,这样做的正确方法是什么?
Qt附带QTest,并且有一些文档:例如,官方教程.
但是,QTest鼓励您将单元测试组织为单独的可执行文件.有一个特殊的宏,它生成main():QTEST_MAIN()
说实话,我真的不喜欢这种方法:通常,一次运行所有测试更有用,以确保最近的更改没有破坏任何东西.有时,屏蔽某些测试或执行某些单独测试很有用,但这是一个例外,而不是规则.
所以,我想立刻运行所有测试.好的,我可以编写自己的main(),执行我想要的所有测试,比如说:
int main(int argc, char **argv)
{
int status = 0;
//-- run all tests
{
TestHTCodecISO14230 tc;
status |= QTest::qExec(&tc, argc, argv);
}
{
TestHTDataMsg tc;
status |= QTest::qExec(&tc, argc, argv);
}
return status;
}
Run Code Online (Sandbox Code Playgroud)
它确实运行所有测试,但问题是我没有方便的所有测试摘要.比如说,对于上面的两个测试,我有两个单独的摘要:
********* Start testing of TestHTCodecISO14230 *********
Config: Using QtTest library 5.4.1, Qt 5.4.1 (i386-little_endian-ilp32 shared (dynamic) release build; by GCC 4.6.1)
PASS : TestHTCodecISO14230::initTestCase()
PASS : TestHTCodecISO14230::decode_summary() …Run Code Online (Sandbox Code Playgroud) 我有叠加View管理WindowManager,就像在这个问题中一样.
简而言之,它看起来像这样:
WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE);
my_view_layout_params = new WindowManager.LayoutParams(
WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY,
WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH,
PixelFormat.TRANSLUCENT);
wm.addView(my_view, my_view_layout_params);
Run Code Online (Sandbox Code Playgroud)
它工作,但如果我需要更改布局参数,我需要删除视图并再次添加它,如下所示:
wm.removeView(my_view);
wm.addView(my_view, my_view_layout_params);
Run Code Online (Sandbox Code Playgroud)
它看起来不是很漂亮.我试着这样做my_view.setLayoutParams(my_view_layout_params),但不幸的是它不起作用.我该怎么做?
我有一个API,允许传入任意路径,例如所有这些:
/api/tags/api/tags/foo/api/tags/foo/bar/baz是有效的路径.我试着把它描述如下:
/tags{tag_path}:
get:
parameters:
- name: tag_path
in: path
required: true
type: string
default: "/"
Run Code Online (Sandbox Code Playgroud)
但是,https: //generator.swagger.io会在路径中对斜杠进行编码,因此它不起作用.那么有没有办法在Swagger中描述我的API?
我之前使用过C(嵌入式东西),我可以像这样初始化我的数组:
int widths[] = { [0 ... 9] = 1, [10 ... 99] = 2, [100] = 3 };
Run Code Online (Sandbox Code Playgroud)
即我可以在初始化程序中指定索引.目前我正在学习Qt/C++,我无法相信这在C++中是不受支持的.
我有这个选项:-std=gnu++0x,但无论如何它不受支持.(我不知道它是否在C++ 11中受支持,因为Qt在gcc 4.7.x中工作有问题)
那么,它真的不支持C++吗?或者也许有办法启用它?
UPD:目前我想初始化const数组,所以std::fill不行.
我很困惑Activity.onDestroy().当我的Activity被销毁时,我需要释放一些资源,但是当我按下"后退"键时,似乎调用了onDestroy(),但是当我的Activity被Dalvik杀死时却没有.我只是通过添加日志来测试它:
Log.v("my_tag", "onDestroy() called");
和onCreate()方法一样:
Log.v("my_tag", "onCreate() called");
然后我开始我的活动,我在日志中看到:onCreate() called.我按"返回"键然后再次启动活动,然后我看到:
onDestroy() called
onCreate() called
Run Code Online (Sandbox Code Playgroud)
然后我按"Home"键再次转到我的Activity,日志不会改变.好的,这里.
然后我再次按"Home"键并启动一些非常"重"的应用程序.在日志中没有任何关于onDestroy(),但当我再次启动我的Activity时,我在日志中看到:onCreate() called!因此,没有调用onDestroy(),但我的Activity被杀了.怎么了?
android ×4
c++ ×4
qt ×4
service ×2
binding ×1
c ×1
foreground ×1
layoutparams ×1
newline ×1
ondestroy ×1
qfiledialog ×1
qmake ×1
qt-designer ×1
qtgui ×1
qttest ×1
swagger ×1
swagger-2.0 ×1
swagger-ui ×1
unit-testing ×1
view ×1