javascript

java

python

c#

android

c++

node.js

php

html

jquery

ios

reactjs

css

.net

git

ruby-on-rails

sql

c

ruby

string

java-扩展AsyncTask <Void,Void,Void>

在我的Android应用中,我通过扩展AsyncTask<Void, Void, Void>类在AsyncTask中执行一些操作。 (我没有用在这个班上执行任何UI)

  1. 这是AsyncTask的正确使用吗?
  2. 如果可以,我可以扩展AsyncTask吗?
  3. 扩展AsyncTaskAsyncTask<Void, Void, Void>有什么区别

代码示例:

public class MessagePooling extends AsyncTask<Void, Void, Void>
{        
    @Override
    protected Void doInBackground(Void... params) 
    {
        while (!isCancelled()) 
        {           
           //Getting data from server            
            SystemClock.sleep(1000);
        }
        return null;
    }
}

要么:

public class MessagePooling extends AsyncTask
{
    @Override
    protected Object doInBackground(Object... params) 
    {
        while (!isCancelled()) 
        {           
           //Getting data from server            
            SystemClock.sleep(1000);
        }
        return null;    
    }
}

谢谢

trans by 2020-08-11T01:37:26Z

性能-Android:requestLayout()调用不正确

当我尝试给ListView中的布局充气时,会发生以下错误:

requestLayout() improperly called by android.widget.TextView{...} during layout: running second layout pass

我正尝试在ListView中扩大布局,如下所示:

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    if(convertView == null){
        LayoutInflater inflater = (LayoutInflater) musicActivity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        convertView = inflater.inflate(R.layout.list_item, parent, false);
        ...
    }else{...}
}

被夸大的布局看起来像下面这样简单,仍然会产生错误

<TextView
    android:id="@+id/txt"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textSize="@dimen/txt_size"/>

我调查了类似的问题,但没有找到解决方案,似乎可以解决问题1,问题2,问题3。

有谁知道是什么原因导致这种类型的错误? 有任何故障排除建议吗? 有关更多上下文,请在ViewPager中的Fragment中显示此ListView

更新

这是完整的XML布局(减去一堆属性),仍然会导致问题

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:layout_width="match_parent"
 android:layout_height="match_parent">

 <TextView
    android:id="@+id/txt1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />

 <TextView
    android:id="@+id/txt2"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />

 <TextView
    android:id="@+id/txt3"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />

<TextView
    android:id="@+id/txt4"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"/>

</RelativeLayout>

基于此,我认为XML本身不是问题,除非它与我正在使用ViewPager和Fragments有关

trans by 2020-08-11T01:28:20Z

animateLayoutChanges不适用于嵌套布局吗?

我有一个如下的嵌套布局:

 <LinearLayout>     <!----Parent layout--->
    <LinearLayout>    <!-----child 1--->
       ...
    </LinearLayout>   <!----child 1 ended--->
    <LinearLayout>    <!-----child 2--->
       ...
    </LinearLayout>   <!----child 2 ended--->
 </LinearLayout>    <!----Parent endded--->

我现在遇到的问题是,由于我所有的数据项都在子项1或子项2内,因此如果我添加或删除项,则子线性布局将以animateLayoutChanges的效果进行动画处理,但父布局将不执行任何动画处理。 (对于所有线性布局,我都将android:animateLayoutChanges设置为true)。 尤其是当我删除子级1中的项目时,动画效果变得很奇怪(基本上,子级2在子级1仍在执行其动画时会跳起来)。

有谁知道如何解决这个问题?

谢谢

更新

发布此问题后不久,我在LayoutTransition API的android开发人员网站上发现了此问题。

由于各种布局级别之间的相互关系,因此无法在嵌套视图层次结构的多个级别上使用LayoutTransition。

那么,对于这个问题的建议,有人可以解决吗?

trans by 2020-08-10T23:05:26Z

android-如何通过一个活动中的取消按钮强制IntentService立即停止?

我有一个从Activity启动的IntentService,我希望能够通过该活动中的“取消”按钮立即从该活动中停止该服务。 一旦按下“取消”按钮,我希望服务停止执行代码行。

我发现了许多与此类似的问题(例如,在这里,在这里,在这里,在这里),但是没有很好的答案。 Activity.stopService()onDestroy()立即执行onHandleIntent()方法,但随后在破坏服务之前让onHandleIntent()中的代码完全完成。

由于显然没有任何保证的方法可以立即终止服务的线程,因此,我可以找到的唯一推荐解决方案是在服务中具有布尔成员变量,可以在onDestroy()方法中对其进行切换,然后几乎每行 封装在其自己的“ if”子句中的onHandleIntent()中的代码中,该变量用于查看该变量。 那是编写代码的糟糕方法。

有人知道在IntentService中执行此操作的更好方法吗?

trans by 2020-08-10T22:06:05Z

在Android开发中,应将哪些文件提交到存储库?

Android项目中的哪些文件应提交到版本控制存储库? 哪些文件不应该提交?

现在,我的.gitignore文件包含以下几行:

# Android generated files #
###########################
android.keystore
local.properties
bin/
gen/
libs/
obj/

# OS generated files #
######################
.DS_Store*
ehthumbs.db
Icon?
Thumbs.db

# Eclipse generated files #
###########################
.settings/org.eclipse.jdt.core.prefs

我有什么想念的吗?

trans by 2020-08-10T21:58:36Z

Android:CoordinatorLayout和SwipeRefreshLayou

我尝试从新的支持库22.2.0实现自动隐藏工具栏功能。 没有SwipeRefreshLayout可以正常工作:

enter image description here

但是当我重新添加此布局时,工具栏与recyclerview重叠:

enter image description here

码:

<android.support.v4.widget.DrawerLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/drawer_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true">

    <android.support.design.widget.CoordinatorLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:fab="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <android.support.design.widget.AppBarLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content">

            <android.support.v7.widget.Toolbar
                xmlns:android="http://schemas.android.com/apk/res/android"
                xmlns:app="http://schemas.android.com/apk/res-auto"
                android:id="@+id/toolbar"
                android:layout_width="match_parent"
                android:layout_height="?attr/actionBarSize"
                android:background="?attr/colorPrimary"
                android:theme="@style/ThemeOverlay.ActionBar"
                app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
                app:layout_scrollFlags="scroll|enterAlways"/>

        </android.support.design.widget.AppBarLayout>

        <android.support.v4.widget.SwipeRefreshLayout
            xmlns:android="http://schemas.android.com/apk/res/android"
            android:id="@+id/swipe_container"
            android:layout_width="match_parent"
            android:layout_height="match_parent">

            <android.support.v7.widget.RecyclerView
                android:id="@+id/cardList"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:scrollbars="vertical"
                app:layout_behavior="@string/appbar_scrolling_view_behavior"/>

        </android.support.v4.widget.SwipeRefreshLayout>
    </android.support.design.widget.CoordinatorLayout>
</android.support.v4.widget.DrawerLayout>

任何想法如何解决这个问题?

trans by 2020-08-10T21:20:23Z

android-为testAndroid设置与主应用程序不同的minSdkVersion

可以为测试设置与应用程序本身不同的minSdkVersion吗? 我问是因为我想使用新的测试支持库和UI Automator进行测试。 但是,这仅在API 18+上可用。 同时,尽管还没有经过全面测试,我仍然希望支持旧版本的Android。 为此,我需要向我的build.gradle文件添加什么?

为了澄清起见,我使用的是Android Studio和“基于Gradle的新”项目结构。

trans by 2020-08-10T20:53:32Z

如何在Android中发出类似Facebook Messenger的通知

我想实现下图所示的通知。

通知随时出现。 我认为这当然是后台服务,等待服务器发出新消息,然后显示此消息。 我认为这是使用此自定义UI实施为对话框的活动。 我对么? 它是服务中的普通startActivity方法吗? 以及如何使过渡动画在显示时通过缩放从左到右缓慢显示?

Enter image description here

trans by 2020-08-10T19:49:08Z

android-onTabSelected选定的未调用

我刚刚将旧的onTabSelected迁移到了新的TabLayout(支持材料设计)。

一切都很好,但我无法拦截选项卡的选择仅在首次显示TabLayout时才调用方法onTabSelected,但是单击选项卡时,什么也没有发生!知道这段代码有什么问题吗?

 tabLayout = (TabLayout) findViewById(R.id.tabs);
    tabLayout.setTabMode(TabLayout.MODE_SCROLLABLE);
    mViewPager = (ViewPager) findViewById(R.id.pager);
    if (mViewPager != null) {
        setupViewPager();
    }
    tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
        @Override
        public void onTabSelected(TabLayout.Tab tab) {

            numTab = tab.getPosition();
            prefs.edit().putInt("numTab", numTab).apply();

        }

        @Override
        public void onTabUnselected(TabLayout.Tab tab) {

        }

        @Override
        public void onTabReselected(TabLayout.Tab tab) {

        }
    });

    tabLayout.setupWithViewPager(mViewPager);
trans by 2020-08-10T18:41:55Z

javascript-是否可以触发智能手机上的共享菜单(通过HTML / JS)?

是否存在通过HTML或JavaScript在智能手机上的本地浏览器中触发共享功能的可能性?

当然,有许多提供共享按钮的服务。 但是当我 要在Facebook上共享网站,我需要使用当前使用的浏览器登录到Facebook。

几乎所有浏览器都内置了共享功能,该功能会触发系统菜单来选择要共享的应用程序:

System share menu in android os

这个问题是关于:如何触发这个菜单?

我知道可以在链接的href属性中触发带有指定前缀的电话,例如tel:callto:。也许此共享菜单的快捷方式也存在吗? 还是一些JavaScript代码? 还是完全不同的方法呢?

提前致谢。

trans by 2020-08-10T17:02:56Z

权限-很好地获取Android所有者的电子邮件地址

我想允许用户在不输入电子邮件地址的情况下提供我的电子邮件地址。理想情况下,会有一个文本字段,用户可以在其中输入电子邮件地址或按按钮以自动填充它。

在先前的问题中,Roman Nurik建议使用AccountManager来处理此问题,但这要求我的应用程序使用GET_ACCOUNTS特权; 然后,我的应用程序可以访问该设备上的所有用户帐户,包括其Facebook / Twitter帐户。 对于我想要的东西,该许可似乎过于广泛。

有没有更好的方法来解决这个问题,而无需授予我的应用如此繁重的权限?

trans by 2020-08-10T16:55:51Z

Android:自动选择调试/发布Maps v2 api密钥?

我在项目中使用Google Maps v2 API。 在Google Maps v2中,调试/发布API密钥是在AndroidManifest.xml中定义的。我已经看到了链接,但是在地图布局中,XML布局文件中的映射密钥是在AndroidManifest.xml中定义的。因此,我可以在AndroidManifest.xml中为我的项目定义调试和发布密钥?

我想要AndroidManifest.xml中的内容如下:

如果是调试模式:

<meta-data
    android:name="com.google.android.maps.v2.API_KEY"
    android:value="@string/debug_map_api_key"/>

如果是释放模式:

<meta-data
    android:name="com.google.android.maps.v2.API_KEY"
    android:value="@string/release_map_api_key"/>
trans by 2020-08-10T16:36:48Z

android-单击(使用个人应用程序)DatePicker在我的设备上崩溃

编辑:我检查了仅当电话设置为“法语”语言时,才出现问题。

我目前正在构建自己的应用程序,并且在手机(调试模式手机:Samsung S5)上使用DatePicker小部件时遇到问题。

错误收集是:java.util.IllegalFormatConversionException

我添加了有关在logcat中收集的问题的更多详细信息:

02-20 10:37:18.255  13029-13029/avappmobile.mytasks E/AndroidRuntime﹕ FATAL EXCEPTION: main
    Process: avappmobile.mytasks, PID: 13029
    java.util.IllegalFormatConversionException: %d can't format java.lang.String arguments
            at java.util.Formatter.badArgumentType(Formatter.java:1489)
            at java.util.Formatter.transformFromInteger(Formatter.java:1689)
            at java.util.Formatter.transform(Formatter.java:1461)
            at java.util.Formatter.doFormat(Formatter.java:1081)
            at java.util.Formatter.format(Formatter.java:1042)
            at java.util.Formatter.format(Formatter.java:1011)
            at java.lang.String.format(String.java:1803)
            at android.content.res.Resources.getString(Resources.java:1453)
            at android.content.Context.getString(Context.java:397)
            at android.widget.SimpleMonthView$MonthViewTouchHelper.getItemDescription(SimpleMonthView.java:684)
            at android.widget.SimpleMonthView$MonthViewTouchHelper.onPopulateNodeForVirtualView(SimpleMonthView.java:628)
            at com.android.internal.widget.ExploreByTouchHelper.createNodeForChild(ExploreByTouchHelper.java:377)
            at com.android.internal.widget.ExploreByTouchHelper.createNode(ExploreByTouchHelper.java:316)
            at com.android.internal.widget.ExploreByTouchHelper.access$100(ExploreByTouchHelper.java:50)
            at com.android.internal.widget.ExploreByTouchHelper$ExploreByTouchNodeProvider.createAccessibilityNodeInfo(ExploreByTouchHelper.java:711)
            at android.view.AccessibilityInteractionController$AccessibilityNodePrefetcher.prefetchDescendantsOfVirtualNode(AccessibilityInteractionController.java:1179)
            at android.view.AccessibilityInteractionController$AccessibilityNodePrefetcher.prefetchDescendantsOfRealNode(AccessibilityInteractionController.java:1091)
            at android.view.AccessibilityInteractionController$AccessibilityNodePrefetcher.prefetchDescendantsOfRealNode(AccessibilityInteractionController.java:1087)
            at android.view.AccessibilityInteractionController$AccessibilityNodePrefetcher.prefetchDescendantsOfRealNode(AccessibilityInteractionController.java:1087)
            at android.view.AccessibilityInteractionController$AccessibilityNodePrefetcher.prefetchDescendantsOfRealNode(AccessibilityInteractionController.java:1087)
            at android.view.AccessibilityInteractionController$AccessibilityNodePrefetcher.prefetchDescendantsOfRealNode(AccessibilityInteractionController.java:1087)
            at android.view.AccessibilityInteractionController$AccessibilityNodePrefetcher.prefetchDescendantsOfRealNode(AccessibilityInteractionController.java:1087)
            at android.view.AccessibilityInteractionController$AccessibilityNodePrefetcher.prefetchDescendantsOfRealNode(AccessibilityInteractionController.java:1087)
            at android.view.AccessibilityInteractionController$AccessibilityNodePrefetcher.prefetchDescendantsOfRealNode(AccessibilityInteractionController.java:1087)
            at android.view.AccessibilityInteractionController$AccessibilityNodePrefetcher.prefetchDescendantsOfRealNode(AccessibilityInteractionController.java:1087)
            at android.view.AccessibilityInteractionController$AccessibilityNodePrefetcher.prefetchDescendantsOfRealNode(AccessibilityInteractionController.java:1087)
            at android.view.AccessibilityInteractionController$AccessibilityNodePrefetcher.prefetchAccessibilityNodeInfos(AccessibilityInteractionController.java:888)
            at android.view.AccessibilityInteractionController.findAccessibilityNodeInfoByAccessibilityIdUiThread(AccessibilityInteractionController.java:155)
            at android.view.AccessibilityInteractionController.access$400(AccessibilityInteractionController.java:53)
            at android.view.AccessibilityInteractionController$PrivateHandler.handleMessage(AccessibilityInteractionController.java:1236)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:145)
            at android.app.ActivityThread.main(ActivityThread.java:5834)
            at java.lang.reflect.Method.invoke(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:372)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1388)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1183)

这是我的DialogFragment代码:

public class DatePFragment extends DialogFragment implements DatePickerDialog.OnDateSetListener {

    DatePicker dp;
    OnDatePickedListener mCallback;
    Integer mLayoutId = null;

    // Interface definition
    public interface OnDatePickedListener {
        public void onDatePicked(int textId, int year, int month, int day);
    }

    // make sure the Activity implement the OnDatePickedListener
    public void onAttach(Activity activity) {
        super.onAttach(activity);

        try {
            mCallback = (OnDatePickedListener)activity;
        }
        catch (final ClassCastException e) {
            throw new ClassCastException(activity.toString() + " must implement OnDatePickedListener");
        }
    }

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState){
        mCallback = (OnDatePickedListener)getActivity();

        Calendar cal = Calendar.getInstance();
        Bundle bundle = this.getArguments();
        mLayoutId = bundle.getInt("layoutId");
        int year = cal.get(Calendar.YEAR);
        int month = cal.get(Calendar.MONTH);
        int day = cal.get(Calendar.DAY_OF_MONTH);

        View view = getActivity().getLayoutInflater().inflate(R.layout.datepfragment, null);

        dp = (DatePicker) view.findViewById(R.id.datePicker);

        // Create a new instance of DatePickerDialog and return it
        return new DatePickerDialog(getActivity(),this,year, month, day);
    }

    @Override
    public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
        if (mCallback != null) {
            // Use the date chosen by the user.

            mCallback.onDatePicked(mLayoutId, year, monthOfYear+1, dayOfMonth);
        }
    }
}

这是关联的xml布局:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/txtDPTitle"
        android:id="@+id/txtDPTitle"
        android:layout_gravity="center_horizontal"
        android:gravity="center"
        android:layout_alignParentTop="true"
        android:layout_alignParentStart="true"
        android:layout_marginTop="35dp" />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/btnDPValidate"
        android:id="@+id/btnDPValidate"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"
        android:layout_marginBottom="35dp" />

    <DatePicker
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/datePicker"
        android:layout_gravity="center_horizontal"
        android:layout_marginLeft="0dp"
        android:datePickerMode="spinner"
        android:calendarViewShown="false"
        android:layout_centerVertical="true"
        android:layout_centerHorizontal="true" />

</RelativeLayout>

事实是我遇到了两种问题(无论如何都会导致应用程序崩溃):

  1. 当我进入我的应用程序并直接转到DatePicker小部件时,日历会正确显示,并且一旦我选择了一天(我说是一天,因为例如更改年份就没有问题),该应用程序就会崩溃。
  2. 如果我继续执行其他功能,请单击以显示DatePicker,它将直接崩溃。

我看到了其他线程,例如:DatePicker在android 5.0的三星中崩溃

在此线程中,我没有得到足够的信息,因为给定的解决方案仅显示日历的微调框视图,而且显示的微调框未居中并显示为我的微调框(直接放在屏幕顶部)。

如果您需要更多详细信息,请询问我。

谢谢。亚历克斯

trans by 2020-08-10T16:12:45Z

java-执行InApp结算时如何保护Google Play公钥

实际上,这对于保护公共密钥有点愚蠢(那么公共密钥的定义是什么?),但是根据Google的文档:

为了保护您的公钥不受恶意用户和黑客的侵害,请不要 将其作为文字字符串嵌入到任何代码中。 相反,构造 在运行时从零开始分割字符串或使用位操作(例如, 与其他字符串进行XOR)以隐藏实际密钥。 关键是 不是秘密信息,但您不想让它变得容易 黑客或恶意用户将公共密钥替换为另一个密钥。

有什么推荐的方法吗?

我知道有很多方法可以做到,我只是不想遵循人们过去处理密码哈希的方式(例如md5,sha1等),我想知道上述用例的最佳实践。

trans by 2020-08-10T15:37:52Z

没有UI的片段的用例是什么?

《 Android开发人员指南》在片段的用法上有不错的部分。 使用片段的一种方法是不使用UI。 有一些参考资料将此用作背景处理,但是Fragments在此领域带来了哪些优势? 在哪里选择在线程,AsyncTasks,处理程序等上使用片段进行后台处理?

trans by 2020-08-10T14:32:36Z

如何在Android资源中使用unicode?

我想在资源文件中使用此unicode字符。

但是,无论我做什么,我都以dalvikvm崩溃结束(已通过Android 2.3和4.2.2测试):

W/dalvikvm( 8797): JNI WARNING: input is not valid Modified UTF-8: illegal start byte 0xf0
W/dalvikvm( 8797):              string: '📡'
W/dalvikvm( 8797):              in Landroid/content/res/StringBlock;.nativeGetString:(II)Ljava/lang/String; (NewStringUTF)
E/dalvikvm( 8797): VM aborting
F/libc    ( 8797): Fatal signal 11 (SIGSEGV) at 0xdeadd00d (code=1), thread 8797 (cz.ipex...)

我在资源文件中尝试了以下版本:

<string name="geolocation_icon" translatable="false">&#x1f4e1;</string> <!-- HTML -->
<string name="geolocation_icon" translatable="false">\uD83D\uDCE1</string> <!-- escaped unicode -->
<string name="geolocation_icon" translatable="false">📡</string> <!-- unicode character -->

请注意,在代码中的Java String中使用它可以正常工作:

final String geolocation_icon = "\uD83D\uDCE1";
trans by 2020-08-10T14:12:29Z

android-重新启动“主页”按钮上的“活动”,但是...仅是第一时间

我正在开发的应用程序在首次安装时有一个奇怪的行为。 如果用户第一次正常退出应用程序,它将永远保持应有的状态。 如果用户在安装应用程序后第一次使用主屏幕按钮,它将把该应用程序视为应重新启动主屏幕,并在旧的屏幕前启动新版本的活动。

因此,实际上有两个问题。 我似乎无法解决这两个问题。

  1. 当用户单击主屏幕按钮时,不要在首次安装该应用程序时使其关闭。
  2. 执行此操作时,请勿启动该应用程序的多个版本(launchMode对此有所帮助,但第一个组件仍会触发)。

我在清单文件中没有定义为任何内容的onUpgrade()属性。 因此,结果不应该有任何奇怪的行为。 现在,我已经对应用程序的launchmode属性进行了试验,以查看是否可以使其按预期的方式运行,但是这里似乎有很多功能,而不仅仅是正常地启动活动。 据我所知,当按下主页按钮时,应用程序第一次没有理由自行关闭。

我也不在应用程序内使用onUpgrade()。 我必须通过对项目进行搜索来再次确定。 因此,似乎没有任何覆盖home按钮的尝试。

即使在重新启动电话后,主页按钮也会恢复正常。 不确定是什么原因导致初始安装将主屏幕按钮视为从头启动应用程序的标志。

用户第一次退出应用程序后,该问题将得到永久解决。 对我应该看的地方有什么想法吗?

最近,在应用程序内进行了搜索,以查看是否仅在此之后才触发,这是因为SQLite数据库方法的onUpgrade()组件导致了某些奇怪的行为。

@Override
public void onUpgrade (SQLiteDatabase db, int oldVersion, int newVersion) {
                if (newVersion > oldVersion) {

           }
       }

或者在另一个位置,如果我将APK的较新版本传递到已经具有比当前版本低一个版本的设备,则该位置可能会触发清单文件的更新。 但是,这段代码中没有任何内容使我相信它应该影响与启动顺序有关的任何内容。

下面提供了清单文件(名称已更改),用于应用程序中当前正在使用的清单文件。

<uses-sdk android:minSdkVersion="10" android:targetSdkVersion="10"/>

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
<uses-permission android:name="com.android.vending.CHECK_LICENSE"></uses-permission>
<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>

<uses-permission android:name="android.permission.VIBRATE" android:required="false"/>
<uses-permission android:name="android.permission.CAMERA" android:required="false"/>
<uses-feature android:name="android.hardware.camera" android:required="false"/>
<uses-feature android:name="android.hardware.camera.autofocus" android:required="false"/>

<application android:icon="@drawable/icon"
             android:label="@string/app_name"
             android:allowBackup="false"
             android:theme="@android:style/Theme.Black.NoTitleBar.Fullscreen"
             >
    <activity android:name=".MyMain"
              android:label="@string/app_name_with_version"
              android:screenOrientation="portrait"
              android:windowSoftInputMode="adjustPan"   />
    <activity android:name=".StartupActivity"
              android:label="@string/app_name"
              android:screenOrientation="portrait"
              >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity   android:name=".SelectActivity"  
                android:label="@string/app_name_with_version"
                android:screenOrientation="portrait"/>
    <activity   android:name=".ImageSelectionActivity"
                android:theme="@android:style/Theme.Dialog"
                android:label="@string/app_name_with_version"
                android:screenOrientation="portrait"
                android:configChanges="orientation|keyboardHidden"/>            
    <activity   android:name=".DetailsActivity"
                android:label="@string/app_name_with_version"
                android:screenOrientation="portrait"/>
    <activity   android:name=".EMailActivity"   
                android:label="@string/app_name_with_version"       
                android:screenOrientation="portrait"/>
    <activity   android:name=".SendTo" 
                android:label="@string/share_label" 
                android:theme="@android:style/Theme.Dialog" >
        <INTENT-FILTER>  
            <ACTION android:name="android.intent.action.MAIN">  
            <CATEGORY android:name="android.intent.category.LAUNCHER"/>  
            <INTENT-FILTER>  
                <ACTION android:name="android.intent.action.VIEW">  
                <CATEGORY android:name="android.intent.category.DEFAULT">  
                    <CATEGORY android:name="android.intent.category.BROWSABLE">  
                    <DATA android:scheme="callback" android:host="twitter"/>  
                    </CATEGORY>  
                </CATEGORY>
                </ACTION>
            </INTENT-FILTER>
            </ACTION>
        </INTENT-FILTER>
    </activity>
    <activity   android:name=".CreateMyActivity"
                android:label="@string/create_account_label"
                android:screenOrientation="portrait"
                android:theme="@android:style/Theme.Dialog"/>
    <activity   android:name=".ViewInLayoutActivity"
                android:label="@string/app_name_with_version"   
                android:screenOrientation="portrait"/>
    <activity   android:name=".Preferences"
                android:label="@string/set_preferences" 
                android:screenOrientation="portrait"
                android:theme="@android:style/Theme.Dialog"/>
    <activity   android:name=".AboutActivity"   
                android:label="@string/app_name_with_version"       
                android:screenOrientation="portrait"/>
    <activity   android:name=".InteractiveActivity" 
                android:label="@string/app_name_with_version"
                android:screenOrientation="portrait"
                android:theme="@android:style/Theme.Dialog"/>   
    <activity   android:name=".AlertFailedCommunications"
                android:screenOrientation="portrait"
                android:label="@string/alert_account_label"
                android:theme="@android:style/Theme.Dialog"/>
</application>    

trans by 2020-08-10T11:45:36Z

Dagger2自定义范围:自定义范围(@ActivityScope)实际如何工作?

我正在阅读GitHub上的Dagger2 Component Scopes Test的源代码,并且看到了为名为Activity-level scopes的活动定义的“自定义范围”,但是我在其他项目中也看到了它,包括具有@PerActivity范围的4模块CleanArchitecture 。

但实际上,Activity-level scopes批注的代码如下:

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

import javax.inject.Scope;

/**
 * Created by joesteele on 2/15/15.
 */
@Scope
@Retention(RetentionPolicy.RUNTIME)
public @interface ActivityScope {
}

它在模块中“神奇地”可用:

@Module
public class ActivityModule {
  @Provides @ActivityScope Picasso providePicasso(ComponentTest app, OkHttpClient client) {
    return new Picasso.Builder(app)
        .downloader(new OkHttpDownloader(client))
        .listener(new Picasso.Listener() {
          @Override public void onImageLoadFailed(Picasso picasso, Uri uri, Exception e) {
            Log.e("Picasso", "Failed to load image: " + uri.toString(), e);
          }
        })
        .build();
  }
}

或CleanArchitecture示例:

@Scope
@Retention(RUNTIME)
public @interface PerActivity {}

@PerActivity
@Component(dependencies = ApplicationComponent.class, modules = ActivityModule.class)
public interface ActivityComponent {
  //Exposed to sub-graphs.
  Activity activity();
}

@Module
public class ActivityModule {
  private final Activity activity;

  public ActivityModule(Activity activity) {
    this.activity = activity;
  }

  /**
  * Expose the activity to dependents in the graph.
  */
  @Provides @PerActivity Activity activity() {
    return this.activity;
  }
}

我可以清楚地看到这与JSR-330自定义作用域有关,但是我真的不明白在这里到底发生了什么,因此该代码启用了给定的模块和/或给定的模块所提供的功能。 取决于实际的Activity-level scopes生命周期,并且仅存在一个实例,但前提是该给定活动处于活动状态。

文档说:

Scope

Dagger 1 only supported a single scope: @Singleton. 
Dagger 2 allows users to any well-formed scope annotation. 
The Component docs describe the details of 
    how to properly apply scope to a component.

它说要看Component docs页面,但这给了我404。我也看到了,但是...

我是否可以寻求帮助,以澄清为什么指定此自定义范围可以神奇地使Activity-level scopes正常工作?

(答案是,子作用域可以从其超级作用域接收依赖关系,并且子作用域只要组件可以接受就可以存在。并且您需要在模块上指定作用域,并且需要指定组件依赖关系才能对一个超级作用域进行子作用域划分。 )

trans by 2020-08-10T11:09:25Z

Android Jetpack到底是什么?

我已经看过Google I / O 2018的开发者主题演讲,并且已经在Android开发者网站上阅读了jetpack主页,但是我无法理解它的实际含义。 对我来说,这似乎只是我们已经使用的一系列API的新名称。 IDE会为我们做些什么还是对编码有帮助? Jetpack中的所有组件均指向其原始的Android文档,实际上并没有显示出与以前的任何区别。 除了网页上的汇总文档,有人可以简单地解释一下Jetpack作为开发人员实际上为我做什么吗?

trans by 2020-08-10T08:37:06Z

如果启用了硬件加速,则WebView会“闪烁”带有白色背景(Android 3.0+)

WebView(Android 3.0+)出现问题,WebView在显示我的黑色背景(“闪烁”)之前始终显示白色背景。 这是我的简单测试代码:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    WebView webView = new WebView(this);
    webView.setBackgroundColor(Color.BLACK);
    setContentView(webView);
    loadWebView(webView);
    webView.loadDataWithBaseURL("localhost://", "<html><head>" +
            "<style>body {background-color: #000}img{max-width:100%}</style></head>" +
            "<body>" +
            "<img src=\"http://developer.android.com/images/practices/actionbar-phone-splitaction.png\" />" +
            "</body></html>", 
            "text/html", "UTF-8", null);
}

我尝试了许多解决方案来摆脱这个问题,但并不幸运。

PS:如果关闭硬件加速,则不会出现此问题。 有人遇到过同样的问题并解决了吗?

谢谢。

trans by 2020-08-10T08:34:09Z

上一页 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 下一页 共280页