由于它在下面的控制台输出中可见,因此应用程序通常需要7-10秒来处理服务,并且通常无法执行此操作.每次启动都会发生这种情况
为什么需要这么长时间?是因为服务在放弃之前尝试连接多次?此外,这个输出背后的逻辑究竟是什么?
注意:我的应用程序中没有任何FirebaseAnalytics代码
09-26 23:34:48.998 /package V/FA: Processing queued up service tasks: 1
09-26 23:34:54.009 /package V/FA: Inactivity, disconnecting from AppMeasurementService
09-26 23:34:57.357 /package V/FA: Activity paused, time: 89152495
09-26 23:34:57.383 /package V/FA: onActivityCreated
Run Code Online (Sandbox Code Playgroud)
的build.gradle(APP)
//Firebase
compile 'com.google.firebase:firebase-core:9.4.0'
compile 'com.google.firebase:firebase-database:9.4.0'
compile 'com.google.firebase:firebase-invites:9.4.0'
compile 'com.firebase:geofire-android:2.0.0'
compile 'com.firebaseui:firebase-ui:0.5.1'
Run Code Online (Sandbox Code Playgroud) TextView textView = new TextView(getActivity());
textView.setBackgroundResource(R.drawable.shape_item_talker_realm);
textView.setText(skill.skill_name);
textView.setTextSize(12);
textView.setPadding(12, 12, 12, 12);
textView.setTextColor(ContextCompat.getColor(getContext(), R.color.userIndexTagText));
ViewGroup.MarginLayoutParams lp = new ViewGroup.MarginLayoutParams(
ViewGroup.LayoutParams.WRAP_CONTENT,
ViewGroup.LayoutParams.WRAP_CONTENT
);
lp.setMargins(0, 0, 15, 15);
Run Code Online (Sandbox Code Playgroud)
我想添加MarginLayoutParams到我的视图中.但是,它显示错误
应该在这里传递解析的像素维度而不是资源ID:
getResource().getDimession*(ViewGroup.LayoutParams.WRAP_CONTENT)
我怎么解决这个问题?
我的 MainActivityonStart()抛出IllegalStateException“片段已添加”消息。我究竟做错了什么?
public class MainActivity extends FragmentActivity implements ServiceConnection {
@Override
protected void onStart() {
super.onStart();
}
}
Run Code Online (Sandbox Code Playgroud)
以下是异常堆栈跟踪:
java.lang.RuntimeException:
Unable to start activity ComponentInfo{com.xxx/com.xxx.MainActivity}:
java.lang.IllegalStateException: Fragment already added: cj{38f8de4c #0 id=0x7f0b0079 cj}
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3190)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3300)
at android.app.ActivityThread.access$1000(ActivityThread.java:211)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1705)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:145)
at android.app.ActivityThread.main(ActivityThread.java:6946)
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:1404)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1199)
Caused by: java.lang.IllegalStateException: Fragment already added: cj{38f8de4c #0 id=0x7f0b0079 cj}
at android.support.v4.app.FragmentManagerImpl.addFragment(FragmentManager.java:1366)
at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:734)
at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1682)
at android.support.v4.app.FragmentController.execPendingActions(FragmentController.java:388)
at android.support.v4.app.FragmentActivity.onStart(FragmentActivity.java:607) …Run Code Online (Sandbox Code Playgroud) 如何在简单的for循环中编写以下代码:
int asInt = (valueAsBytes[3] & 0xFF)
| ((valueAsBytes[2] & 0xFF) << 8)
| ((valueAsBytes[1] & 0xFF) << 16)
| ((valueAsBytes[0] & 0xFF) << 24);
Run Code Online (Sandbox Code Playgroud) 当我的应用程序尝试绘制系统覆盖图时,它会崩溃并告诉我2010窗口类型的权限被拒绝.但是,我要求用户ACTION_MANAGE_OVERLAY_PERMISSION在首次安装时授予教程活动.此外,这只发生在API 26上.我测试了所有其他支持的SDK,我能够绘制一个没有崩溃或错误的叠加层.
我用过
Settings.canDrawOverlay(context);
Run Code Online (Sandbox Code Playgroud)
它返回true.因此,似乎系统知道授予许可但问题仍然存在.
这是覆盖代码:
LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(LAYOUT_INFLATER_SERVICE);
inflater.inflate(R.layout.view_driving, mRelativeLayout);
WindowManager.LayoutParams layoutParams = new WindowManager.LayoutParams(
WindowManager.LayoutParams.MATCH_PARENT,
WindowManager.LayoutParams.MATCH_PARENT,
WindowManager.LayoutParams.TYPE_SYSTEM_ERROR,
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS,
PixelFormat.TRANSLUCENT);
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP){
layoutParams.flags = WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS;
} else{
layoutParams.flags = WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS;
}
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){
layoutParams.flags = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;
}
int uiOptions = View.SYSTEM_UI_FLAG_LAYOUT_STABLE
| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION // hide nav bar
| View.SYSTEM_UI_FLAG_FULLSCREEN // hide status bar
| View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY;
layoutParams.screenOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;
mRelativeLayout.setSystemUiVisibility(uiOptions);
if(Settings.canDrawOverlays(mContext)){
WindowManager windowManager = (WindowManager) mContext.getSystemService(WINDOW_SERVICE);
windowManager.addView(mRelativeLayout, layoutParams); …Run Code Online (Sandbox Code Playgroud) TL; DR我可以在一个intent-filter中使用两个动作和两个类别吗?
我的应用程序由一个活动和五个片段组成.我在这个活动中有一个Intent过滤器.
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
Run Code Online (Sandbox Code Playgroud)
今天,我application在清单文件中的标签周围看到了一条lint消息"App无法通过Google索引......" .所以,我做了一些搜索,并且知道你可以用它来通过谷歌搜索索引你的应用程序.如果Android用户从chrome/systemBrowser浏览Web链接"www.example.com/myapp",他将被带到我的应用程序而不是网页.对?
现在,我必须向活动添加一个ActionView.而且,我的意图过滤器将成为,
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.LAUNCHER" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="http" android:host="www.example.com" android:pathPrefix="/myapp" />
</intent-filter>
Run Code Online (Sandbox Code Playgroud)
但是,我已经读到使用两个动作并不好.这是一个逻辑OR操作.Intent-Filter只匹配其中一个:
据我所知,它应该在第一个选项的设备上打开应用程序,当用户使用提供的"www.example.com/myapp"浏览浏览器时,它应该使用第一个和第四个选项从链接打开应用程序.
我看过这个问题,但我需要确定一个例子.
这令人困惑.我可能完全错了,请指导我.
android deep-linking intentfilter android-manifest android-intent
我需要int[2000][2000]用一些逻辑来填充矩阵.
我填充数组的代码:
// n: (1 to 2000)
for(int i=0; i<n; i++){
for(int j=0; j<n; j++){
uniMatrix[i][j] = (((calc(i * j * i * j)) & 1) == 0) ? 0 : 1;
}
}
Run Code Online (Sandbox Code Playgroud)
在这里:i * j * i * j是我对正方形的看法i*j.这calc()是一个用于获取值的方法.然后,我检查返回的值calc()是偶数还是奇数.如果它是偶数,我存储0在矩阵中(i, j),否则我存储1在其中.
我的calc()功能如下:
private static int calc(int n){
// value of n=calc(1 | 2 | 3) is known
if(n < 4) return …Run Code Online (Sandbox Code Playgroud) 长话短说
当片段的 UI(toggleButton) 从正在运行的服务在屏幕上可见时,我需要更新它。
背景
我有toggleButton一个片段(名为 homeFragment)。它显示Stop文本if(toggleButton.isChecked),否则显示Start文本。这toggleButton将启动和停止服务。
现在,有两种方法可以停止此服务。一种是再次点击toggleButton(停止服务),另一种是通过服务本身。
当此服务启动时,toggleButton显示“停止”文本。该服务创建粘性通知并this.stopSelf在之后调用。此通知有一个关闭此通知的按钮。此选项调用 aBroadcastReceiver来停止/取消通知。
问题/要求
现在,当通过通知按钮关闭服务时,如果应用程序可见或位于前台,我想toggleButton在片段上触发该应用程序以再次显示开始文本。如果 appActivity 处于后台/暂停/关闭状态,我不需要处理这个问题(我通过签sharedPrefs入来处理onCreate())
我试过:
使用布尔 SharedPref 键(例如isServiceRunning)来跟踪服务状态。在 中onCreate(),我保存了一个true布尔值。在 中onDestoy(),我保存了一个false布尔值。然后,我注册一个onSharedPreferencesChangeListener来sharedPrefs(inside fragment)检查 的isServiceRunningsharedPrefkey 是否更改。并且,如果是的话,它会调用toggleButton.setChecked(false);
这种方法很少奏效。有时有效,有时什么也没有发生。
使用a LocalBroadcastReceiver,但它有很多错误。喜欢,can't Instantiate Receiver: no empty method。我试图解决,但发现这需要很多工作。而且,除此之外,访问另一个类中的 Fragment 视图简直是一团糟,因为你必须为它们提供layout …
java android broadcastreceiver android-service android-fragments
android ×6
java ×3
deep-linking ×1
firebase ×1
fragment ×1
intentfilter ×1
matrix ×1
permissions ×1
recursion ×1