查看原文
其他

手写Service后台下载app——跳出DownloadManager系统7.0之坑

2017-03-10 androidstarjack 终端研发部

前言

之前项目中有关app的现在和更新相关工具类一直用的是Android系统下载管理DownloadManager功能。如果随着Android系统的不断提升再加上Android开源性 手机厂家 
对此作恶部分改动。导致一些系统自带的工具类出现异常情况。

华为P9

华为P9/P9 Plus上线,你的APP准备好了吗?

新机入手后,MTC率先从应用市场随机下载部分APP做基于P9/P9 Plus的兼容性测试,在Monkey脚本跑完之后,我们发现部分App会出现Crash、ANR的问题。在此跟开发小伙伴们分享下产生此类问题的原因,开发小伙伴们在App开发过程中多加注意,避免此类问题的产生。

华为P9使用该 华为P9在7.1的时候,利用系统DownloadManager工具类下载时就出现异常——在下载过程中竟突然自动消失!

怀疑这个应该是Android系统和华为P9不兼容导致的一个的bug。

大家都知道,老板不懂代码,有时候出现的问题还不属于你的问题。在其他手机上好使,部分手机就出现问题。 只要有一款手机出现一个问题就认为你的程序有问题。

这是最蛋疼的。so,问题来了,谁让你是安卓程序员呢

哈哈,抱怨是没有用的。有问题还是要解决的。

1.首先是要判断是6.0权限

/**     * 请求运行时权限     * eg:     */      public void requestRuntimePermission(QuestPermissionListener questPermissionListener, String... permissions){          BasePermisitionActivity.requestRuntimePermission(permissions,questPermissionListener);      }      .......

6.0运行权限请参考: 

下载service工具类:


注意这里的LocalBroadcastManager

LocalBroadcastManager基本介绍 这个类是在v4包中的,谷歌官方的介绍是:

Helper to register for and send broadcasts of Intents to local objects within your process. This is has a number of advantages over sending global broadcasts with sendBroadcast(Intent): 
You know that the data you are broadcasting won’t leave your app, so don’t need to worry about leaking private data. It is not possible for other applications to send these broadcasts to your app, so you don’t need to worry about having security holes they can exploit. It is more efficient than sending a global broadcast through the system.

大致意思是: 
帮助程序注册和发送Intents的广播到您的进程中的本地对象。 这是一个有趣的发送全局广播与sendBroadcast(Intent): 
你知道你收音机的数据不会离开你的应用程序,所以不需要担心泄露的私人数据。 其他应用程序不可能将这些广播发送到您的应用程序,因此您不需要担心它们可以利用的安全漏洞。 它比通过系统发送全局广播更有效。

优点:

  • 能够完成在应用内的广播发送,而且比全局广播更具优势:

  • 广播只会在你的应用内发送,所以无需担心数据泄露,更加安全。

  • 其他应用无法发广播给你的应用,所以也不用担心你的应用有别人可以利用的安全漏洞

  • 相比较全局广播,它不需要发送给整个系统,所以更加高效。

使用方式

  • 广播注册:

LocalBroadcastManager localBroadcastManager = LocalBroadcastManager.getInstance(getActivity());  IntentFilter filter = new IntentFilter();  filter.addAction(ACTION);  myBroadcastReciver = new MyBroadcastReciver();  localBroadcastManager.registerReceiver(myBroadcastReciver, filter);
  • 广播发送

Intent intent = new Intent(); intent.setAction(SaleLeftFragment.ACTION); intent.putExtra(TAG, data); LocalBroadcastManager.getInstance(getActivity()).sendBroadcast(intent);
  • 使用注意

在使用的时候,请关注以下几点:

  • 1).LocalBroadcastManager注册广播只能通过代码注册的方式。

  • 2).LocalBroadcastManager注册广播后,一定要记得取消监听。

  • 3).重点的重点,使用LocalBroadcastManager注册的广播,您在发送广播的时候务必使用LocalBroadcastManager.sendBroadcast(intent);否则您接收不到广播

主Activity中的代码:

public class MainActivity extends AppCompatActivity {    /**     * 下载地址的URL     */    private static final String URL = "http://192.168.1.11/mydoctor.apk";    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        ButterKnife.inject(this);    }    public void update(View view){        UpdateService.Builder.create(URL).build(this);    }    @OnClick(R.id.btn_downLoad)    public void onClick(View view){        UpdateService.Builder.create(URL)                .setStoreDir("update/flag")                .setDownloadSuccessNotificationFlag(Notification.DEFAULT_ALL)                .setDownloadErrorNotificationFlag(Notification.DEFAULT_ALL)                .build(this);    } }

androidstarjack的项目地址:

项目下载地址: 

如果你觉得此文对您有所帮助,欢迎入群 QQ交流群 :232203809    
微信公众号:终端研发部

(欢迎关注学习和交流)

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存