我正在尝试找到一种在Android浏览器中使用开发者工具的方法,例如Chrome和Firefox.它们似乎没有附带构建版本,以避免使用我认为不到1%的用户使用的功能而使它们混乱.
我的背景:我现在使用我的Android手机作为功能开发环境,在最近的一个桌面Android界面(+键盘和桌面显示器)上使用Termux和Vim.但是,我不能在本地进行Web开发,因为它需要使用浏览器开发工具(至少是控制台,检查器和调试器).Firefox和Chrome的远程调试不会这样做,因为重点是避免使用笔记本电脑.
鉴于它们现在是独立的HTML/React应用程序(chrome和firefox),
在Play商店中提供这些浏览器的"开发者版本"有多难?
是否有可能将它们集成为Web扩展(至少对于Firefox,因为Chrome for Android会将它们停用)?
或者,由于两个浏览器都可以远程调试,这意味着它们会公开API.两个浏览器都通过unix套接字与主机通信.
我可以看到它们正在运行(cat/proc/net/unix | grep devtool),但我无法将其转发到localhost:9222,这是chrome dev工具前端需要的.
应该在Android设备上重现的是简单的命令:
adb -s <device> forward tcp:9222 localabstract:@chrome_devtools_remote.
我天真地尝试的是:socat -d tcp-listen:9222,fork abstract-connect:chrome_devtools_remote.
不幸的是,它不起作用:"由同行重置连接".我是否错过了从Unix套接字到JS开发工具前端可以理解的某种翻译步骤?
android unix-socket google-chrome-devtools firefox-developer-tools
当用户第一次打开它时,我的应用程序使用75MB内存.
我使用Android Studio中的Android Profiler工具来检查我的Android应用程序的内存使用情况.当主屏幕打开时,应用程序开始使用75MB内存,即使主活动不会创建任何需要太多内存的对象.没有位图或任何大数组等.
40MB来自"代码"部分,19MB来自"本机",我们在此活动中不加载任何本机库.我们在用户打开另一个Activity之后加载.我试图减少内存使用量,我想知道如何从"代码"和"本机"部分减少.
Android Profiler的屏幕截图
我ScrollView在顶部有一个,里面有一个ConstraintLayout. 将高度设置为match_parent在 ConstraintLayout 中不起作用,因此高度与屏幕不匹配。在我的内部,我ConstraintLayout有一个浮动操作按钮,它没有停留在屏幕的右下角,而是停留在ConstraintLayout.
我的屏幕图像
如何使浮动操作按钮停留在屏幕右下角?
我已将我的构建迁移到使用版本目录。我已从 build.gradle 中删除了以下内容
plugins {
id 'kotlin-android'
id 'kotlin-kapt'
}
Run Code Online (Sandbox Code Playgroud)
和
kapt "androidx.room:room-compiler:$room_version"
annotationProcessor "androidx.room:room-compiler:$room_version"
kapt "com.google.dagger:hilt-compiler:$hilt_version"
Run Code Online (Sandbox Code Playgroud)
现在我得到了
warning: The following options were not recognized by any processor:
'[dagger.hilt.internal.useAggregatingRootProcessor, room.schemaLocation,
dagger.fastInit, dagger.hilt.android.internal.disableAndroidSuperclassValidation,
dagger.hilt.android.internal.projectType]'
Run Code Online (Sandbox Code Playgroud)
1 条警告
和
A failure occurred while executing
com.android.build.gradle.internal.tasks.MergeJavaResWorkAction
> 2 files found with path 'META-INF/gradle/incremental.annotation.processors' from
inputs:
- /.gradle/caches/transforms-
3/5f588ae3973231906376832b3350f55d/transformed/jetified-hilt-android-compiler-
2.45.jar
- /.gradle/caches/transforms-
3/f1c91d9e7fbd546100043f736678c477/transformed/jetified-dagger-compiler-2.45.jar
Run Code Online (Sandbox Code Playgroud)
现在我想知道如何kotlin-kapt作为插件添加到版本目录中。或者如何使用annotationProcessor版本目录?
annotation-processing android-studio android-gradle-plugin android-jetpack-compose
我正在尝试在我的移动设备和我的穿戴设备之间同步数据。但没有任何成功。我认为我按照开发人员文档做了所有事情。
这是我的移动代码的 MainActivity:
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
import com.google.android.gms.tasks.OnSuccessListener;
import com.google.android.gms.tasks.Task;
import com.google.android.gms.wearable.DataClient;
import com.google.android.gms.wearable.DataItem;
import com.google.android.gms.wearable.PutDataMapRequest;
import com.google.android.gms.wearable.PutDataRequest;
import com.google.android.gms.wearable.Wearable;
import java.util.Date;
public class MainActivity extends AppCompatActivity {
Button button;
private static final String COUNT_KEY = "com.example.torbengab.sendwatchmessage";
DataClient mDataClient;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button = findViewById(R.id.button2);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
sendStuff();
}
});
}
private void sendStuff() {
mDataClient = Wearable.getDataClient(this);
PutDataMapRequest …Run Code Online (Sandbox Code Playgroud) 我有一个Android应用程序需要每隔午夜将备份数据发送到我的云服务器.为此,我需要安排每24小时一次的工作.我已经阅读了有关AlarmManager和JobScheduler类的信息,可以有效地安排你的工作.
在我的情况下,我使用的是JobScheduler类,这里是我的scheduleJob()方法,它将作业设置为每隔86400000毫秒(即一天)后安排.
@RequiresApi(api =Build.VERSION_CODES.LOLLIPOP)
public void scheduleJob(View v){
JobInfo.Builder builder = new JobInfo.Builder(1,new ComponentName(this,JobSchedule.class));
builder.setPersisted(true);
builder.setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY);
builder.setPeriodic(86400000);
builder.setRequiresCharging(false);
builder.setRequiresDeviceIdle(false);
builder.setBackoffCriteria(10000,JobInfo.BACKOFF_POLICY_EXPONENTIAL);
int test = jobScheduler.schedule(builder.build());
if(test <= 0){
//sth went wrong
}
}
Run Code Online (Sandbox Code Playgroud)
我的问题是,从哪里以及如何实现jobSchedule()以便我可以让脚本在午夜12点运行.
另外,如果我从Android的Activity XYZ的onCreate()方法调用scheduleJob方法,那么每次 调用Activity XYZ时,都会调用它的覆盖方法onCreate()并调度另一个作业.那么我应该做什么,从哪里安排工作,以便在应用程序的整个生命周期内只安排一项工作?
总结一个例子,Whatsapp每天凌晨2点备份数据.即使我关闭了网络连接,它也会在我上线后立即备份我的数据.我想在我的应用程序中实现类似的功能.
现在我有这个代码:
class MyFragment : DaggerFragment() {
...
private fun setTimePickerDialog() {
binding.timeButton.setOnClickListener{
val calendar = viewModel.calendar
val curHourOfDay = calendar.get(Calendar.HOUR_OF_DAY)
val curMinute = calendar.get(Calendar.MINUTE)
val dialog = TimePickerDialog(context, { _, hourOfDay, minute ->
val c = Calendar.getInstance()
c.set(1970, 0, 1, hourOfDay, minute)
viewModel.time.value = SimpleDateFormat("HH:mm:ss").format(c.time)
}, curHourOfDay, curMinute, true)
dialog.show()
}
}
...
}
Run Code Online (Sandbox Code Playgroud)
我想利用 DataBinding 库而不是setOnClickListener在我的片段中写入。但我无法将此代码移至ViewModel,因为需要上下文。通过使用 DataBinding 和 MVVM 单击按钮来显示 DatePickerDialog 的简洁方法是什么?
android mvvm android-databinding android-architecture-components
每当我在Android Studio(版本3.0.1)中进行代码更改时,我需要在构建之前进行清理,以使更改生效.进行更改并按下绿色箭头构建/运行按钮看起来像是构建,但除非事先清理项目,否则不会合并新的更改.例如,如果我添加一些日志记录然后构建/运行,则新的日志不会出现,直到我清理然后再次构建/运行.几乎所有的变化似乎都是这种情况.有时它可以工作,大部分时间它没有.
编译器应检测代码的更改并每次重建这些文件.感觉就像他们优先考虑构建速度而不是正确性.还有其他人解决了这个问题吗?如果没有那么是否有一些设置在每次构建/运行之前强制清理?