从扩展应用程序的另一个类调用活动中的方法



嗨,我正在尝试从另一个名为 Startup 的类在 MainActivity 中调用此方法,该类扩展了应用程序,以便每次应用程序启动时都可以加载它:

有人可以告诉我如何做到这一点吗?我已经阅读了很多答案,但我还没有看到任何具有扩展应用程序的类的问题,我认为这导致了问题。我看到的所有答案都是关于如何从另一个扩展 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();
}
}

我建议做一些事情,比如让 MainActivity 启动,并在onCreateofthe MainActivity中调用Startup类中的方法来初始化某个方法。 原因是您不知道活动将在什么时候初始化,因此请等待它,然后在需要时在生命周期回调中初始化某些方法。

例如。

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();
}
}

并在主活动中做这样的事情。

@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);
}

由于您无法new活动,并且不应持有对活动的静态引用来调用此方法(因为它可能导致泄漏(,因此通过应用程序类访问活动方法的正确方法是通过BroadcastReceiver。下面是一个简单的示例:

主活动.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);
}
}

启动.java

public class Startup extends Application {
...
public void callShowPinLayout() {
sendBroadcast(new Intent(MainActivity.ACTION_SHOW_PIN_LAYOUT));
}
}

请注意,要使其正常工作,必须先创建 MainActivity,因此请在确保创建活动后在合理的时间调用callShowPinLayout

此外,我建议创建EventBus库以缓解此类内容。

编辑:

由于您打算在用户启动应用程序时显示 PIN 锁,因此您应该只处理活动。我建议实现如下操作:将引脚锁定布局声明为独立活动。创建启动活动(可以是初始屏幕(并将其标记为启动器AndroidManifest.xml活动,以决定是显示引脚锁定还是主活动。

启动活动.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();
}
}

安卓清单.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,如果发生热启动,您可以根据需要轻松启动强大的StatupActivityonResume()您的MainActivity

最新更新