欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android获取清单文件中的meta-data,解决碰到数值为null的问题

程序员文章站 2022-05-28 14:05:57
1.meta-data是什么?如何获取meta-data?在androidmanifest.xml中,元素可以作为子元素,被包在activity、application 、service、或者rece...

1.meta-data是什么?如何获取meta-data?

在androidmanifest.xml中,元素可以作为子元素,被包在activity、application 、service、或者receiver元素中,不同的父元素,在应用时读取的方法也不同。

在activity中:

    activityinfo info = null;
    try {
      info = this.getpackagemanager().getactivityinfo(getcomponentname(), packagemanager.get_meta_data);
    } catch (packagemanager.namenotfoundexception e) {
      e.printstacktrace();
    }
    info.metadata.getstring("meta_name");

在application中:

applicationinfo appinfo = null;
    try {
      appinfo = this.getpackagemanager().getapplicationinfo(getpackagename(), packagemanager.get_meta_data);
    } catch (packagemanager.namenotfoundexception e) {
      e.printstacktrace();
    }
    appinfo.metadata.getstring("meta_name");

在service中:

componentname cn = new componentname(this, xxxxservice.class);
    serviceinfo info = null;
    try {
      info = this.getpackagemanager().getserviceinfo(cn, packagemanager.get_meta_data);
    } catch (packagemanager.namenotfoundexception e) {
      e.printstacktrace();
    }
    info.metadata.getstring("meta_name");

在receiver中:

componentname cn = new componentname(getapplicationcontext(), xxxxxreceiver.class);
    activityinfo info = null;
    try {
      info = getapplicationcontext().getpackagemanager().getreceiverinfo(cn, packagemanager.get_meta_data);
    } catch (packagemanager.namenotfoundexception e) {
      e.printstacktrace();
    }
    info.metadata.getstring("meta_name");

2.遇到的问题:获取到值为null

之前在application中获取一直key值,但是一直获取到的都是null,后来人大神说:读取字符串的数值要用info.metadata.getint,尝试了一下,弯的佛,成功拿到,如果是数值类型的,获取值的时候,可以采用:

info.metadata.getint("meta_name"));

替代

info.metadata.getstring("meta_name");

补充知识:android webview拦截替换本地资源,提升加载性能,节省流量

现在许多游戏都是直接提供一个访问地址,然后由webview去访问加载,加载速度的快慢取决于网速,当然也耗流量,这个时候,为了提高产品竞争力,产品经理就会提出需求了,web前端的同学也就会把资源给到android前端,接下来就是要做的处理了,代码不多,用作记录:

package com.dxgame.demo;

import android.net.uri;
import android.os.build;
import android.os.bundle;
import android.support.annotation.requiresapi;
import android.support.v7.app.appcompatactivity;
import android.text.textutils;
import android.util.log;
import android.webkit.mimetypemap;
import android.webkit.webresourcerequest;
import android.webkit.webresourceresponse;
import android.webkit.webview;
import android.webkit.webviewclient;

import java.io.inputstream;
import java.util.hashmap;

public class checklocal extends appcompatactivity {

  private webview webview;

  @override
  protected void oncreate(bundle savedinstancestate) {
    super.oncreate(savedinstancestate);
    setcontentview(r.layout.check_local);
    webview.setwebviewclient(webviewclient);
  }


  //webviewclient主要帮助webview处理各种通知、请求事件
  private webviewclient webviewclient = new webviewclient() {

    @requiresapi(api = build.version_codes.lollipop)
    public webresourceresponse shouldinterceptrequest(webview view, webresourcerequest request) {
      uri uri = request.geturl();
      webresourceresponse response = checklocalwebresourceresponse(uri);
      if (response != null) {
        return response;
      }
      return super.shouldinterceptrequest(view, request);
    }

    @requiresapi(api = build.version_codes.lollipop)
    public webresourceresponse shouldinterceptrequest(webview view, string url) {
      uri uri = uri.parse(url);
      webresourceresponse response = checklocalwebresourceresponse(uri);
      if (response != null) {
        return response;
      }
      return super.shouldinterceptrequest(view, url);
    }
  };

  @requiresapi(api = build.version_codes.lollipop)
  private webresourceresponse checklocalwebresourceresponse(uri uri) {
    webresourceresponse resourceresponse = null;
    string urlstr = uri.tostring();
    log.i("checkurl", urlstr);
    string path = uri.getpath();
    if (!textutils.isempty(path)) {
      path = path.substring(1);
    }
    try {
      inputstream input = getassets().open(path);
      if (input != null) {
        log.i("assetspath", path);
        string mimetype = mimetypemap.getsingleton().getmimetypefromextension(path.substring(path.lastindexof(".") + 1));
        hashmap<string, string> header = new hashmap<>();
        header.put("access-control-allow-origin", "*");
        header.put("access-control-allow-headers", "content-type");
        resourceresponse = new webresourceresponse(mimetype, "", 200, "ok", header, input);
      }
    } catch (exception e) {
      e.printstacktrace();
    }
  }
   return resourceresponse;
}

还可以进一步优化,利用webview的缓存机制,将数据缓存到本地,方法就不列出来了,网上有很多,自行百度

以上这篇android获取清单文件中的meta-data,解决碰到数值为null的问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。