Вызов метода в действии из другого класса, расширяющего Application - PullRequest
0 голосов
/ 20 июня 2020

Привет, я пытаюсь вызвать этот метод в MainActivity из другого класса Startup, который расширяет Application, чтобы он мог загружаться при каждом запуске приложения:

Может кто-нибудь показать мне, как это сделать? Я прочитал много ответов, но я еще не встречал вопросов с классом, расширяющим Application, я думаю, что это вызвало проблему. Все ответы, которые я видел, касаются того, как вызвать метод из другого класса, который расширяет Activity: /

это метод в mainActivity:

 public void showPinLayout() {

        //if initialize in oncreate will cause nullpointer error
        indicatorDots = (IndicatorDots) findViewById(R.id.indicator_dotsMain);
        pinLockView = (PinLockView) findViewById(R.id.pinlockviewMain);
        pinLockView.attachIndicatorDots(indicatorDots);
...
}

это класс Startup, который расширяет Приложение было инициализировано в манифесте:

<application
        android:name=".Startup" ...>
public class Startup extends Application {

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

        Toast.makeText(this, "Startup", Toast.LENGTH_SHORT).show();

        MainActivity mainActivity = new MainActivity();
        mainActivity.showPinLayout();
    }
}

Ответы [ 2 ]

1 голос
/ 20 июня 2020

Поскольку вы не можете new действие, и вы не должны содержать ссылку stati c на действие для вызова этого метода (поскольку это может привести к утечкам), правильный способ доступа к методу действия через класс приложения через BroadcastReceiver. Вот простой пример:

MainActivity. java

public class MainActivity extends AppCompatActivity {
    public static final String ACTION_SHOW_PIN_LAYOUT = "com.example.package.SHOW_PIN_LAYOUT";

    private BroadcastReceiver mReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            showPinLayout();
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate();
        ...
        registerReceiver(mReceiver, new IntentFilter(ACTION_SHOW_PIN_LAYOUT));
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        ...
        unregisterReceiver(mReceiver);
    }
}

Startup. java

public class Startup extends Application {

    ...

    public void callShowPinLayout() {
        sendBroadcast(new Intent(MainActivity.ACTION_SHOW_PIN_LAYOUT));
    }
}

Обратите внимание, что для этого сначала необходимо создать MainActivity, поэтому вызовите callShowPinLayout в подходящее время, когда вы убедились в создании своей активности.

Также я бы предложил EventBus библиотека, созданная для облегчения подобных проблем.

Изменить:

Поскольку вы собираетесь показывать блокировку контактов при запуске приложения пользователем, вам следует иметь дело только с действиями. Я бы порекомендовал реализовать что-то вроде следующего: Объявление макета блокировки контактов как независимого действия. Создание действия при запуске (может быть экран spla sh) и его отметка как действие средства запуска в AndroidManifest.xml, чтобы решить, отображать ли блокировку контактов или основное действие.

StartupActivity. java

public class StartupActivity extends AppCompatActivity {

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

        boolean shouldShowLockScreen = true;  // you can replace this with your own lock screen visibility algorithm
        if (shouldShowLockScreen) {
            // Open LockScreenActivity
            Intent intent = new Intent(this, LockScreenActivity.class);
            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            startActivity(intent);
        } else {
            // Open MainActivity
            Intent intent = new Intent(this, MainActivity.class);
            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            startActivity(intent);
        }
        finish();
    }
}

AndroidManifest. java

<application
    ...>
    <activity
        android:name=".StartupActivity"
        android:theme="@style/StartupTheme">
        <intent-filter>
            <action android:name="android.intent.action.MAIN"/>
            <category android:name="android.intent.category.LAUNCHER"/>
        </intent-filter>
        ...
    </activity>
</application>

В этой реализации каждый раз, когда пользователь входит в приложение с холодным запуском, алгоритм блокировки экрана определяет, должен ли он / она вводить MainActivity или нет, и если произойдет горячий запуск, вы можете легко запустить свой мощный StatupActivity, если необходимо, в onResume() вашего MainActivity.

1 голос
/ 20 июня 2020

Я бы посоветовал сделать что-то вроде запуска MainActivity , а в onCreate из MainActivity вызовите метод в Startup class для инициализации некоторого метода. причина в том, что вы не знаете, в какое время будет инициализировано действие, поэтому подождите его, а затем на Жизненный цикл Обратный вызов инициализирует какой-либо метод, если это необходимо.

Например,

public class Startup extends Application {

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

        Toast.makeText(this, "Startup", Toast.LENGTH_SHORT).show();

       
    }

    public void initMain(Context context){
      ((MainActivity)context).showPinLayout();
    }

}

и в MainActivity сделайте что-то вроде этого.

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    //just before showing the UI, call the application class method to initialize some method if needed
    ((Startup)getApplicationContext()).initMain(this);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...