嗨,我正在尝试从另一个名为 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
,如果发生热启动,您可以根据需要轻松启动强大的StatupActivity
onResume()
您的MainActivity
。