我有一个小部件,需要在onUpdate()中执行可能长时间运行的操作.只是直接执行操作导致ANR.为了解决这个问题,我的第一次尝试是在其中创建一个线程.我注意到在某些情况下小部件不会更新.我的猜测是,一旦onUpdate()退出,android可能会杀死进程以及未完成的线程.
我的下一次尝试是创建一个意向服务.小部件的onUpdate()只是启动intent服务,它直接完成工作并在完成后更新小部件.这很有用,但令我惊讶的是,onHandleIntent()似乎是单线程的.如果我有两个小部件,然后更新并启动意向服务,它们会按顺序更新...
两个小部件的情况并不重要,但我只是想知道这种模式的最佳实践.
为了解决这两个小部件的情况,每当点击其中任何一个时,我都会用相同的数据更新所有小部件实例.例如,我执行一次长时间运行的过程并将结果应用于所有小部件实例.在我的场景中这没关系,但对于许多小部件来说,重要的是不要这样做.
想法?
我们有一个类似文件管理器的应用程序,我们使用操作栏主页按钮作为"进入文件夹结构"操作.如果用户位于文件夹结构的顶部,则应禁用该按钮.
当用户在子文件夹中时,我们将主页按钮设置为up.当我们到达顶部文件夹时,我们禁用显示为up.
// Update home
actionBar.setDisplayHomeAsUpEnabled(hasParent);
Run Code Online (Sandbox Code Playgroud)
问题是该按钮仍然"启用",因为用户可以按下它可以看到被按下的视觉反馈.我们希望在没有父文件夹的情况下,在这种情况下完全禁用操作栏主页按钮.
我试着打电话setDisplayShowHomeEnabled(),但是没有禁用按钮,而是完全取消了主页按钮.
有任何想法吗?谢谢.
android允许我发起创建新联系人的意图.我可以将额外内容添加到预填充新联系人字段的意图中.
Intent intent = new Intent(Intent.ACTION_INSERT);
intent.setType(ContactsContract.Contacts.CONTENT_TYPE);
intent.putExtra(ContactsContract.Intents.Insert.NAME, "Foo Bar");
intent.putExtra(ContactsContract.Intents.Insert.PHONE, "(408) 555-1212");
intent.putExtra(ContactsContract.Intents.Insert.EMAIL, "foo.bar@foobar.com");
startActivityForResult(intent, INSERT_CONTACT_REQUEST);
Run Code Online (Sandbox Code Playgroud)
这工作,但我不知道如何处理给定字段的多种类型,比如电话号码.在意图中,我可以添加一个额外的电话号码,我可以增加一个电话号码类型,但我如何额外增加一个额外的电话号码,具有不同的(或可能是相同的)类型?
我希望有一个 android 画廊,将托管不同纵横比的图像。我想要的是画廊中图像的 CENTER_CROP 之类的东西。但是,当我将图像比例类型设置为此时,图像会超出图库图像边框。
当然, FIT_XY 会产生压扁/展平的图像。CENTER 导致画廊图像边框内的水平或垂直黑色空间。
任何想法如何做到这一点?我能找到的每个例子都使用带有固定尺寸图像的 FIT_XY。我想我可以自己裁剪图像,但我不想。
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ImageView iv = (ImageView) convertView;
if (iv == null) {
iv = new ImageView(context);
iv.setScaleType(ImageView.ScaleType.FIT_XY);
iv.setBackgroundResource(galleryItemBackground);
iv.setLayoutParams(new Gallery.LayoutParams(200, 200));
}
InputStream is;
try {
is = getInputStream(position);
} catch (IOException ioe) {
// TODO?
throw new RuntimeException(ioe);
}
Bitmap bm = BitmapFactory.decodeStream(is);
iv.setImageBitmap(bm);
/*
* if (bitmaps[position] != null) { bitmaps[position].recycle();
* bitmaps[position] = null; } bitmaps[position] = bm; …Run Code Online (Sandbox Code Playgroud) 我想创建一个与Gallery小部件一起使用的延迟加载适配器.
也就是说立即getView()返回一个ImageView,后来其他一些机制会异步调用它的setImageBitmap()方法.我通过创建一个ImageView延伸的"懒惰" 来做到这一点ImageView.
public class GalleryImageView extends ImageView {
// ... other stuff here ...
public void setImage(final Looper looper, final int position) {
final Uri uri = looper.get(position);
final String path = looper.sharePath(position);
new Thread(new Runnable() {
@Override
public void run() {
GalleryBitmap gbmp = new GalleryBitmap(context, uri, path);
final Bitmap bmp = gbmp.getBitmap(); // all the work is here
handler.post(new Runnable() {
@Override
public void run() …Run Code Online (Sandbox Code Playgroud) 我希望我的应用能够在意图中"发送"电子邮件地址时作出响应.例如,当用户点击通讯录应用中的电子邮件地址时,会显示Gmail和电子邮件应用.我想进入那个名单.
我的第一次尝试是匹配scheme ="mailto",
<intent-filter>
<action android:name="android.intent.action.SEND" />
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="mailto" />
</intent-filter>
Run Code Online (Sandbox Code Playgroud)
这没用.下一次尝试是匹配pathPattern =".@. ".
<data android:pathPattern=".*@.*" />
Run Code Online (Sandbox Code Playgroud)
这不起作用,正如JD所说,只有指定了主机方案才有意义.
有任何想法吗?谢谢?
我一直对此感到沮丧,我找不到一个好的答案,所以希望有人在这里提供指导.
我有一个AsyncTask广泛使用的片段.我一直受到片段调用的错误的困扰getActivity(),它返回null.我假设这些正在发生,因为片段中的某些方法在附加活动之前或分离之后被调用.
在我的代码中处理这个问题的正确方法是什么?我不想让这个成语遍布整个地方,
Activity activity = getActivity();
if (activity != null) { // do something }
Run Code Online (Sandbox Code Playgroud)
看文档的Fragment,我可以想出许多可能钩来解决这个:isDetached(),onActivityCreated(),onAttach(),isResumed(),等.什么是正确的组合?
编辑:
有些人建议在暂停时取消任务,但这意味着标准成语,
new AsyncTask<...>.execute();
Run Code Online (Sandbox Code Playgroud)
不能使用.这意味着每个执行者都AsyncTask需要跟踪完成或取消.我在Google或其他地方的示例代码中从未见过这种情况.就像是,
private final Set<AsyncTask<?>> tasks = new HashSet<>;
...
AsyncTask<?> t = new AsyncTask<...>() {
...
public void onPostExecute(...) {
tasks.remove(this);
...
}
}
tasks.add(t);
t.execute();
...
@Override
public void onPause() {
for (AsyncTask<?> t: tasks) {
t.cancel();
}
tasks.clear();
}
Run Code Online (Sandbox Code Playgroud) 我们向第三方开发者公开 AIDL 服务。我们希望从此服务返回可打包对象,但我们担心向后兼容性。我的意思是,针对 Parcelable 版本 N 编译的客户端和针对版本 N+1 编译的服务必须协同工作。
根据我的测试,对于简单的平面对象(仅限简单类型字段),只要将新字段打包在流的末尾,就可以向后兼容...例如,
in.writeInt(field1);
in.writeInt(field2); // new field
Run Code Online (Sandbox Code Playgroud)
然而,当涉及到复杂的物体时,事情就会爆炸。例如,
class D implements Parcelable {
int field1;
}
class C implements Parcelable {
List<D> ds;
}
Run Code Online (Sandbox Code Playgroud)
如果将第二个字段添加到 class 中D,
class D implements Parcelable {
int field1;
int field2; // new field
}
Run Code Online (Sandbox Code Playgroud)
类的解组C失败(我尝试使用Parcel.writeList()和Parcel.writeParcelableArray())。
这件案子竟然无法处理,这似乎几乎是不可想象的。当然,我们可以按原样保留旧的绑定器接口,并创建一个新的绑定器接口,该接口返回带有附加字段的新类的对象,但是对于返回经常更改的类的服务,这将导致混乱。例如,接口 1.0 返回一个Person. 现在我们添加一个字段,并且我们有一个新的binder接口2.0,它返回Person2对象,等等。
这让我们不得不使用一些更宽容的格式(例如 JSON)来传递 IPC 数据。
有什么建议么?
请注意,虽然我在Android的上下文中问这个问题,但更多的是关于pipe(2)的一般unix问题......
要将大量数据从一个进程传输到另一个进程,可以使用ParcelFileDescritor.createPipe(),然后通过绑定器将管道的读取端发送到另一个进程.ParcelFileDescritor.createPipe()直接映射到unix管道(2)系统调用.
虽然FD通过绑定器安全地传输到另一个进程,但由于FD最终只是一个int,它是否有可能被恶意进程发现,甚至猜到,打开并读取?
从我的阅读来看,这似乎归结为通过默默无闻的安全.只要你不知道,并且无法猜出FD int值,那就没关系了.匿名管道不会暴露出以其他方式发现FD的方法.但理论上似乎有人可以编写一个具有大量线程的应用程序,这些线程不断尝试基于随机int值打开整数,可能会利用一些模式来选择数字并最终利用管道(2).
我有一个带有漂亮背景选择器的按钮.精细.而不是按钮中的文字,我想要一个图像.我试过把它改成一个带有src属性的ImageButton.当我这样做时,看起来灰色背景覆盖在我的选择器后面,在src图像后面.
当我改回常规按钮时,问题就消失了.我想要的只是我的背景选择器,加上src图像(而不是按钮文本).
有任何想法吗?
android ×10
aidl ×1
background ×1
gallery ×1
image ×1
imagebutton ×1
ipc ×1
parcel ×1
parcelable ×1
pipe ×1
unix ×1