小编Dav*_*ser的帖子

如何模拟Android杀死我的进程

如果进程在后台并且操作系统决定它需要资源(RAM,CPU等),Android将终止进程.我需要能够在测试期间模拟这种行为,以便我可以确保我的应用程序正常运行.我希望能够以自动方式执行此操作,以便我可以测试应用程序在发生这种情况时是否正常运行,这意味着我必须在每个活动中对此进行测试等.

我知道如何杀死我的进程.那不是问题.问题是,当我杀死我的过程(使用DDMS, ,adb shell kill,Process.killProcess()等)的Android不重新启动它以同样的方式,它将如果Android操作系统杀死了它本身.

如果Android操作系统终止进程(由于资源要求),当用户返回应用程序时,Android将重新创建该进程,然后在活动堆栈上重新创建顶级活动(调用onCreate()).

另一方面,如果终止进程,Android会假定活动堆栈顶部的活动表现不佳,因此它会自动重新创建进程,然后从活动堆栈中删除顶级活动并重新创建下面的活动顶级活动(调用onCreate()`).这不是我想要的行为.我想要与Android杀死进程时相同的行为.

只是用图解来解释,如果我的活动堆栈看起来像这样:

    ActivityA -> ActivityB -> ActivityC -> ActivityD
Run Code Online (Sandbox Code Playgroud)

如果Android终止进程并且用户返回应用程序,Android将重新创建该进程并创建ActivityD.

如果我终止该过程,Android将重新创建该过程并创建ActivityC.

android

164
推荐指数
8
解决办法
3万
查看次数

为什么这个任务会导致NPE?

public class Npe {
    static class Thing {
        long value;
    }

    public static Map<Thing, Long> map;

    public static void main(String[] args) {
        Thing thing = new Thing();
        method(null); // returns -1
        method(thing); // returns 0
        map = new HashMap<Thing, Long>();
        method(null); // returns -1
        method(thing); // NullPointerException thrown inside this method call
    }

    public static long method(Thing thing) {
        if (thing == null) {
            return -1;
        }
        Long v = (map == null) ? thing.value : map.get(thing); // NPE here …
Run Code Online (Sandbox Code Playgroud)

java ternary-operator nullpointerexception

26
推荐指数
1
解决办法
1326
查看次数

应用程序从最近的应用列表中删除后,Android服务崩溃

我有一个由活动启动(未绑定)的服务.如果活动被破坏(例如通过按下后退按钮),则服务继续运行,这当然是有意的.但是,如果我将活动从"最近的应用"列表中滑出,则会立即重新启动该服务.这是可重现的,每次从列表中删除活动/应用程序时,都会对服务的onCreate方法进行新调用.两者之间没有调用onDestroy!

首先我认为服务被android杀死了,尽管我没有看到杀人的理由(活动和服务都没有资源消耗的东西,事实上它们是简约的,什么都不做).但后来我注意到服务实际上崩溃了.

V/MainActivity(856): onDestroy // swipe out of the list
I/ActivityManager(287): Killing 856:com.example.myapp/u0a10050: remove task
W/ActivityManager(287): Scheduling restart of crashed service com.example.myapp/.TestService in 5000ms
Run Code Online (Sandbox Code Playgroud)

代码并不值得注意,但在这里

活动:

public class MainActivity extends Activity {

    private static final String TAG = "MainActivity";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Log.v(TAG, "onCreate, starting service...");
        startService(new Intent(this, TestService.class));
    }

    @Override
    protected void onStart() {
        super.onStart();
        Log.v(TAG, "onStart");
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.v(TAG, "onDestroy");
    }

    //[...]
}
Run Code Online (Sandbox Code Playgroud)

服务:

public class TestService extends …
Run Code Online (Sandbox Code Playgroud)

android android-service

22
推荐指数
1
解决办法
1万
查看次数

Android致命错误 - 在onSaveInstanceState之后无法执行此操作

我在Android中请求权限后尝试执行片段事务 - 但应用程序不断崩溃.如何更改此代码以避免这种情况?

任何帮助表示赞赏.

在发送电子邮件之前检查许可:

private void emailShare() {
    if (mayRequestContacts()) {
        emailShareImpl();
    }
}
Run Code Online (Sandbox Code Playgroud)

检查许可:

private boolean mayRequestContacts() {
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
            return true;
        }

        requestPermissions(new String[]{READ_CONTACTS}, REQUEST_READ_CONTACTS);

        return false;
    }
Run Code Online (Sandbox Code Playgroud)

允许检查结果:

  @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        if (requestCode == REQUEST_READ_CONTACTS) {
            if (grantResults.length == 1 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                emailShareImpl();
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

如果获得批准,则启动碎片交易:

 private void emailShareImpl() {
        FragmentManager fragmentManager = getActivity().getSupportFragmentManager();
        EmailReferDialog mEmailReferDialog = new EmailReferDialog();
        mEmailReferDialog.setCancelable(true);
        mEmailReferDialog.show(fragmentManager, "EMAIL_REFER_DIALOG"); …
Run Code Online (Sandbox Code Playgroud)

android android-intent android-fragments android-permissions android-savedstate

14
推荐指数
1
解决办法
5003
查看次数

在 flutter 应用程序中,目标 S+(版本 31 及更高版本)要求在创建 PendingIntent 时指定 FLAG_IMMUTABLE 或 FLAG_MUTABLE 之一

请帮我解决这个问题。我给出了 git 的链接。 https://github.com/Vasajj/radio_tysa_fm.git PendingIntent 出现问题,包:flutter_radio_player 在 android 8 上一切都很好

Installing build\app\outputs\flutter-apk\app.apk...
Debug service listening on ws://127.0.0.1:55138/iMdUmbZTaNc=/ws
Syncing files to device sdk gphone64 x86 64...
I/javaClass(18284): Calling to method: initService
I/javaClass(18284): start service invoked
I/javaClass(18284): Attempting to initialize service...
I/javaClass(18284): Service not bound, binding now....
I/javaClass(18284): Mapping method call to player item object
I/javaClass(18284): Firing up service. (onStartCommand)...
I/javaClass(18284): LocalBroadCastManager Received...
W/e.radio_tysa_f(18284): Accessing hidden method Landroid/media/AudioTrack;->getLatency()I (unsupported, reflection, allowed)
I/ExoPlayerImpl(18284): Init 398a550 [ExoPlayerLib/2.13.1] [emulator64_x86_64_arm64, sdk_gphone64_x86_64, Google, 32]
I/javaClass(18284): Pushing Event: …
Run Code Online (Sandbox Code Playgroud)

android android-pendingintent flutter exoplayer2.x

11
推荐指数
2
解决办法
1万
查看次数

更改微调器下拉列表的位置

我需要改变Spinner下拉列表的水平位置.这是截图:

在此输入图像描述

我希望这个下拉列表在主图标/文本下面的一行中显示,这样看起来很好

如图所示:

在此输入图像描述

这是我在xml中所做的:

<Spinner
    android:id="@+id/tvHeader"
    style="@style/spinner_style"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignBottom="@+id/ver_main_donate_background_tile_long"
    android:layout_alignTop="@+id/ver_main_donate_background_tile_long"
    android:layout_marginTop="5dp"
    android:layout_toRightOf="@+id/icon_main_header"
    android:spinnerMode="dropdown"
    android:dropDownHorizontalOffset="-15dp"
    android:gravity="left|center_vertical"

    android:text="@string/name_of_product" />
Run Code Online (Sandbox Code Playgroud)

所以,正如我想的那样,

android:spinnerMode="dropdown"
android:dropDownHorizontalOffset="-15dp"
Run Code Online (Sandbox Code Playgroud)

应该做的伎俩,但正如你在截图上看到的那样,它不起作用

android spinner android-layout

10
推荐指数
2
解决办法
1万
查看次数

BroadcastReceiver CONNECTIVITY_CHANGE总是在第一次启动应用程序中运行?

我在Google Developer上阅读了它:

("android.net.conn.CONNECTIVITY_CHANGE")操作只要连接详细信息发生更改

我有这个代码:

公共类MainActivity扩展AppCompatActivity {

private NetworkChangeReceiver receiver;
private boolean connIntentFilterIsRegistered;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    receiver = new NetworkChangeReceiver();
}

@Override
protected void onPause() {
    super.onPause();
    if (connIntentFilterIsRegistered) {
        unregisterReceiver(receiver);
        connIntentFilterIsRegistered = false;
    }
}

@Override
protected void onResume() {
    super.onResume();
    if (!connIntentFilterIsRegistered) {
        registerReceiver(receiver, new IntentFilter("android.net.conn.CONNECTIVITY_CHANGE"));
        connIntentFilterIsRegistered = true;
    }
}
Run Code Online (Sandbox Code Playgroud)

和//

公共类NetworkUtil {

public static int TYPE_WIFI = 1;
public static int TYPE_MOBILE = 0;
public static int TYPE_NOT_CONNECTED = 2;

public static …
Run Code Online (Sandbox Code Playgroud)

android broadcastreceiver android-activity

10
推荐指数
1
解决办法
1587
查看次数

电子邮件意图主题在 gmail 中被忽略,但适用于其他邮件客户端

下面提到的代码主题显示在其他电子邮件帐户中,但在 gmail 中显示为空白。

Intent j = new Intent(Intent.ACTION_SENDTO);
j.setData(Uri.parse("mailto:appsupport@prali.in"));
j.putExtra(Intent.EXTRA_SUBJECT, "Request approval for Kiranam Registration - " + KiranamUserId);
startActivity(Intent.createChooser(j, "Select your mail account to send mail for Approval"));
Run Code Online (Sandbox Code Playgroud)

android android-intent

10
推荐指数
2
解决办法
694
查看次数

中心文本垂直独立于视图高度?

我正在尽力将文本垂直居中,但我无法做到.问题是我有一行按钮,其高度= fill_parent和weight = 1,随着行变小,我的文本开始触摸视图的底部,如下所示:

在此输入图像描述

我尝试去除填充,边距,更改高度等.但似乎没有做到这一点.

即使文本大小接近视图高度,如何将其垂直对齐?

这是包含数字5的视图的代码:

    <Button
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:text="5"
        android:layout_weight="1"
        tools:ignore="HardcodedText"
        android:clickable="false"
        android:textSize="90dp"
        android:textColor="?attr/color1"
        android:gravity="center"
        android:paddingLeft="@dimen/normal_margin"
        android:paddingRight="@dimen/normal_margin"
        android:padding="0dp" />
Run Code Online (Sandbox Code Playgroud)

android view android-layout

9
推荐指数
1
解决办法
521
查看次数

当应用程序被杀死时,Android 警报管理器不起作用

我想安排一个每 1 分钟触发一次的闹钟并唤醒我的应用程序。它适用于模拟器,但不适用于定制的操作系统手机,如 VIVO、OPPO、MIUI 等。我编写了粘性服务和广播接收器。当服务将被销毁或 TaskRemoved 时,我调用了名为 sendBroadcast() 的方法,该方法将触发我的广播接收器,而我的 Brodcast 接收器将通过调用 startservice(intent) 方法再次启动服务。但这在应用程序被杀死时不起作用。当应用程序在前台时它工作正常。我希望警报管理器在应用程序被杀死时能够工作。

这是我下面的代码--

我的 MainActivity.java 文件启动服务--

public class MainActivity extends AppCompatActivity
{

@Override
protected void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    Intent alarmIntent = new Intent(this, AlarmService.class);
    startService(alarmIntent);


}   }
Run Code Online (Sandbox Code Playgroud)

我的粘性服务代码是——

public class AlarmService extends Service
{

private String TAG ="AlarmService";
@Override
public void onCreate()
{
    sendBroadcast();
    super.onCreate();
}

@Override
public int onStartCommand(Intent intent, int flags, int startId)
{
    Log.e(TAG, "onStartCommand");
    //return super.onStartCommand(intent, flags, startId);
    return Service.START_STICKY;
}


@Override
public …
Run Code Online (Sandbox Code Playgroud)

android

9
推荐指数
3
解决办法
7219
查看次数