小编Jef*_*man的帖子

android长时间运行更新appwidget的操作

我有一个小部件,需要在onUpdate()中执行可能长时间运行的操作.只是直接执行操作导致ANR.为了解决这个问题,我的第一次尝试是在其中创建一个线程.我注意到在某些情况下小部件不会更新.我的猜测是,一旦onUpdate()退出,android可能会杀死进程以及未完成的线程.

我的下一次尝试是创建一个意向服务.小部件的onUpdate()只是启动intent服务,它直接完成工作并在完成后更新小部件.这很有用,但令我惊讶的是,onHandleIntent()似乎是单线程的.如果我有两个小部件,然后更新并启动意向服务,它们会按顺序更新...

两个小部件的情况并不重要,但我只是想知道这种模式的最佳实践.

为了解决这两个小部件的情况,每当点击其中任何一个时,我都会用相同的数据更新所有小部件实例.例如,我执行一次长时间运行的过程并将结果应用于所有小部件实例.在我的场景中这没关系,但对于许多小部件来说,重要的是不要这样做.

想法?

android android-appwidget

6
推荐指数
1
解决办法
2294
查看次数

android:禁用动作栏主页按钮

我们有一个类似文件管理器的应用程序,我们使用操作栏主页按钮作为"进入文件夹结构"操作.如果用户位于文件夹结构的顶部,则应禁用该按钮.

当用户在子文件夹中时,我们将主页按钮设置为up.当我们到达顶部文件夹时,我们禁用显示为up.

    // Update home
    actionBar.setDisplayHomeAsUpEnabled(hasParent);
Run Code Online (Sandbox Code Playgroud)

问题是该按钮仍然"启用",因为用户可以按下它可以看到被按下的视觉反馈.我们希望在没有父文件夹的情况下,在这种情况下完全禁用操作栏主页按钮.

我试着打电话setDisplayShowHomeEnabled(),但是没有禁用按钮,而是完全取消了主页按钮.

有任何想法吗?谢谢.

android android-actionbar

6
推荐指数
1
解决办法
6926
查看次数

插入联系人意图,多个电话/电子邮件/等类型?

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 android-contacts

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

具有任意纵横比的android画廊

我希望有一个 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)

android image gallery

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

android画廊视图"口吃"与延迟图像加载适配器

我想创建一个与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)

android android-gallery android-adapter

5
推荐指数
2
解决办法
2880
查看次数

android intent-filter监听发送的电子邮件地址?

我希望我的应用能够在意图中"发送"电子邮件地址时作出响应.例如,当用户点击通讯录应用中的电子邮件地址时,会显示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所说,只有指定了主机方案才有意义.

有任何想法吗?谢谢?

android android-intent

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

片段,什么时候我"活跃"?

我一直对此感到沮丧,我找不到一个好的答案,所以希望有人在这里提供指导.

我有一个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)

android android-fragments

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

android AIDL 接口、parcelables 和向后兼容性

我们向第三方开发者公开 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 ipc parcelable aidl

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

ParcelFileDescritor.createPipe(),又名pipe(2)和安全性

请注意,虽然我在Android的上下文中问这个问题,但更多的是关于pipe(2)的一般unix问题......

要将大量数据从一个进程传输到另一个进程,可以使用ParcelFileDescritor.createPipe(),然后通过绑定器将管道的读取端发送到另一个进程.ParcelFileDescritor.createPipe()直接映射到unix管道(2)系统调用.

虽然FD通过绑定器安全地传输到另一个进程,但由于FD最终只是一个int,它是否有可能被恶意进程发现,甚至猜到,打开并读取?

从我的阅读来看,这似乎归结为通过默默无闻的安全.只要你不知道,并且无法猜出FD int值,那就没关系了.匿名管道不会暴露出以其他方式发现FD的方法.但理论上似乎有人可以编写一个具有大量线程的应用程序,这些线程不断尝试基于随机int值打开整数,可能会利用一些模式来选择数字并最终利用管道(2).

unix android pipe parcel android-binder

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

android ImageButton获取灰色背景

我有一个带有漂亮背景选择器的按钮.精细.而不是按钮中的文字,我想要一个图像.我试过把它改成一个带有src属性的ImageButton.当我这样做时,看起来灰色背景覆盖在我的选择器后面,在src图像后面.

当我改回常规按钮时,问题就消失了.我想要的只是我的背景选择器,加上src图像(而不是按钮文本).

有任何想法吗?

android background imagebutton

4
推荐指数
1
解决办法
4412
查看次数