我的应用需要在每天的特定时间从网上获取一些数据.所以我使用AlarmManager来安排任务,这是正常的.
但是在查看各种示例时,似乎有两种方法可以处理AlarmManager的待处理意图.
一个用于PendingIntent.getBroadcast()在闹钟响起时呼叫广播接收器,并且在该接收器内部开始执行实际工作的服务.
另一种方法是PendingIntent.getService()在警报响起时直接使用和调用服务.
有人可以向我解释两种方法之间的区别,以便我可以决定依赖哪一种方法吗?
编辑:还有一个问题是在使用getService()时获取唤醒锁定的位置?
例如,当使用BroadcastReceiver时,我在onReceive()中有以下行:
WakeReminderIntentService.acquireStaticLock(context);
Run Code Online (Sandbox Code Playgroud)
如果我直接调用服务,我应该如何获得唤醒锁:
PendingIntent pi = PendingIntent.getService(this, 0, new Intent(this, OnAlarmReceiver.class), PendingIntent.FLAG_UPDATE_CURRENT);
Run Code Online (Sandbox Code Playgroud)
我应该简单地从服务中获取它吗?
我找到了关于如何删除三条空行的问题和答案.但是,我只需要双空行.IE浏览器.应完全删除所有双空行,但应保留单个空白行.
我知道一点sed,但建议的删除三个空行的命令是我的头脑:
sed '1N;N;/^\n\n$/d;P;D'
从几个版本开始,Google Chrome已经开始在开发者控制台中显示JS违规.虽然这有时很有用,但更常见的是它只会使控制台变得混乱.
有没有办法禁用这些违规行为?
另外,从最近开始,开发人员控制台不再具有各种类型的调试输出的复选框.现在您只有日志级别:详细,信息,警告,错误.我发现前一个带复选框的方法更有用 - 是否有某种方式(一个标志?)让它们回来?
我一直在努力调试为什么以下删除查询实际上没有删除任何内容,即使完全相同的数据库上的完全相同的查询在Firefox的SQLite管理器中工作正常...
String deleteSql = "DELETE FROM showsummary WHERE url IN (SELECT url FROM showsummary JOIN article_categories USING (url) WHERE categoryid=20 AND title LIKE 'page=%')";
mDb.rawQuery(deleteSql, null);
Run Code Online (Sandbox Code Playgroud)
由于JOIN和子查询都有点复杂,我的想法围绕Android的sqlite实现中关于子查询的一些限制,所以我尝试简化查询.但它仍然没有删除任何东西.
然后我将其更改为选择查询(刚刚用SELECT*替换DELETE)并且这样做有效.所以可能不是连接或子查询毕竟是罪魁祸首.
为了测试select查询,我moveToFirst()在返回的游标中添加了一个:
mDb.rawQuery(deleteSql, null).moveToFirst();
Run Code Online (Sandbox Code Playgroud)
当我后来再次将其更改回删除查询时,我忘记删除 moveToFirst() 它然后它工作了!
它现在很好用,但我很困惑为什么有必要移动光标以实际删除任何东西.这是设计还是错误?
Chrome的DevTools有几个有用的过滤器来限制日志记录:Errors,Warnings,Info等.
调用最后一个过滤器Handled,我还没有找到用于它的内容.没有console.handle()或类似.谷歌搜索没有提供答案.
为什么以及如何使用Handled过滤器?
在我的应用程序中,用户可以使用不同的标准选择要下载的文章.其中一个是年月.为此,我想要一个带有年份列表的AlertDialog.如果用户点击一年,该列表将展开并显示1月,2月等.
我知道如何使用SimpleExpandableListAdapter 创建可扩展的列表视图,但这不是我想要的.由于其他标准(例如类别)也列出AlertDialogs,我想要一些外观和感觉相似的东西.
是否有可能完成这样的可扩展列表AlertDialog?
解
基于CommonsWare的解决方案,这就是我最终的结果:
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("Select something");
ExpandableListView myList = new ExpandableListView(this);
MyExpandableListAdapter myAdapter = new MyExpandableListAdapter();
myList.setAdapter(myAdapter);
builder.setView(myList);
AlertDialog dialog = builder.create();
dialog.show();
Run Code Online (Sandbox Code Playgroud)
仅剩下问题:如何为AlertDialog实现onClick侦听器?通常我会在setItems()方法中执行此操作,但不使用setItems.
我在myList.setAdapter()之后添加了myList.setOnItemClickListener,但它被忽略了.单击某个项目时没有任何反应:
myList.setOnItemClickListener(new ListView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> a, View v, int i, long l) {
try {
Toast.makeText(ExpandableList1.this, "You clicked me", Toast.LENGTH_LONG).show();
}
catch(Exception e) {
System.out.println("something wrong here ");
}
}
});
Run Code Online (Sandbox Code Playgroud)
点击问题的解决方案:
解决方案非常简单.由于它是可扩展列表,因此列表本身会捕获项目单击以打开子元素.因此,永远不会调用事件处理程序.
相反,你必须实现OnChildClickListener() - 顾名思义 - 监听子点击!
我有一个由ExpandableListView填充的AlertDialog.列表本身运行良好,但由于某些原因,点击被忽略.显然我的点击处理程序永远不会被调用.
这是代码:
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("Select something");
ExpandableListView myList = new ExpandableListView(this);
MyExpandableListAdapter myAdapter = new MyExpandableListAdapter();
myList.setAdapter(myAdapter);
myList.setOnItemClickListener(new ExpandableListView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> a, View v, int i, long l) {
try {
Toast.makeText(ExpandableList1.this, "You clicked me", Toast.LENGTH_LONG).show();
}
catch(Exception e) {
System.out.println("something wrong here ");
}
}
});
builder.setView(myList);
dialog = builder.create();
dialog.show();
Run Code Online (Sandbox Code Playgroud)
如果我尝试使用普通列表视图填充AlertDialog,则会生成单击事件而不会出现问题:
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("Select Color Mode");
ListView modeList = new ListView(this);
String[] stringArray = new String[] { "Bright Mode", …Run Code Online (Sandbox Code Playgroud) 我正在开发一个可以从某些网页中提取信息的应用程序.我们的想法是,当用户位于浏览器中的特定网址路径中并按下共享按钮时,我的应用将显示在接收方应用列表中.
通过将其添加到清单中,我可以轻松地做到这一点:
<intent-filter android:label="@string/app_name" >
<action android:name="android.intent.action.SEND" />
<data android:mimeType="text/plain" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
Run Code Online (Sandbox Code Playgroud)
但是,这将使我的应用程序出现在所有网址的列表中,也是所有那些无关的地方.相反,我希望应用程序只在这些网址中出现在选择器中:
www.example.com/foo/bla.html
www.example.com/foo/bar/blabla.html
但不是从这些:
www.example.com
www.foobar.com
等等.只能在某个主机上的某个路径内.另请注意,当用户点击符合条件的链接时,我不希望启动我的应用.它只应从共享菜单中调用.
所以我的问题是:如何限制我的应用程序出现在意图中仅选择某些网址?
我经常使用Chrome的调试器控制台来试验javascript代码片段.当我做对了,我通常想将所需的命令复制到我的脚本中,但这里是它变得混乱的地方.对于命令没有过滤器选项,也没有办法调用某些命令(比如在Bash中使用Ctrl-R),因此您需要逐步执行历史记录中的所有命令并逐个复制所需的命令.
相反,我认为应该可以从某个文件或Sqlite数据库中检索命令历史记录.但我找不到它.
所以我的问题是:Chrome的调试器控制台命令历史存储在哪里?
在Chrome for Android中浏览时,如果将URL识别为与您关联的登录详细信息,则Lastpass会弹出建议.
它如何知道Chrome正在查看哪个网址?我知道Lastpass使用了辅助功能服务,但我想知道它是如何从Chrome查询当前网址的.
PS.显然它只适用于Chrome(例如,它不会在Opera中弹出),所以它可能是Chrome特有的.