Android Studio:应用程序运行时出现白色屏幕
我正在开发一个应用程序,当我运行这个应用程序时,我会在启动屏幕之前看到一个白色的屏幕 在启动屏幕上,我在后台创建了数据库,而且我有推送通知注册码。有关推送通知注册,请参阅链接。所以我的闪屏代码如下:Android Studio:应用程序运行时出现白色屏幕,android,android-studio,google-cloud-messaging,splash-screen,Android,Android Studio,Google Cloud Messaging,Splash Screen,我正在开发一个应用程序,当我运行这个应用程序时,我会在启动屏幕之前看到一个白色的屏幕 在启动屏幕上,我在后台创建了数据库,而且我有推送通知注册码。有关推送通知注册,请参阅链接。所以我的闪屏代码如下: public class SplashScreenActivity extends AppCompatActivity { private static final int PLAY_SERVICES_RESOLUTION_REQUEST = 9000; private Broadc
public class SplashScreenActivity extends AppCompatActivity {
private static final int PLAY_SERVICES_RESOLUTION_REQUEST = 9000;
private BroadcastReceiver mRegistrationBroadcastReceiver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_splash_screen);
mRegistrationBroadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context);
boolean sentToken = sharedPreferences.getBoolean(QuickstartPreferences.SENT_TOKEN_TO_SERVER, false);
if (sentToken) {
// TODO token sent to server
} else {
// TODO show error that token not sent to server
}
}
};
if (checkPlayServices()) {
// Start IntentService to register this application with GCM.
Intent intent = new Intent(this, RegistrationIntentService.class);
startService(intent);
}
InitializeScreen();
}
private boolean checkPlayServices() {
GoogleApiAvailability apiAvailability = GoogleApiAvailability.getInstance();
int resultCode = apiAvailability.isGooglePlayServicesAvailable(this);
if (resultCode != ConnectionResult.SUCCESS) {
if (apiAvailability.isUserResolvableError(resultCode)) {
apiAvailability.getErrorDialog(this, resultCode, PLAY_SERVICES_RESOLUTION_REQUEST).show();
} else {
Log.i("Splash screen activity", "This device is not supported.");
finish();
}
return false;
}
return true;
}
@Override
protected void onPause() {
LocalBroadcastManager.getInstance(this).unregisterReceiver(mRegistrationBroadcastReceiver);
super.onPause();
}
@Override
protected void onResume() {
super.onResume();
LocalBroadcastManager.getInstance(this).registerReceiver(mRegistrationBroadcastReceiver, new IntentFilter(QuickstartPreferences.REGISTRATION_COMPLETE));
}
private void InitializeScreen() {
new LoadDataBase(SplashScreenActivity.this).execute(SplashScreenActivity.this);
}
private class LoadDataBase extends AsyncTask<Context, Void, Void> {
Context context;
public LoadDataBase(Context context){
this.context = context;
}
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected Void doInBackground(Context... arg0) {
// Create data base from assets folder.
DatabaseHelper databaseHelper = new DatabaseHelper(arg0[0]);
try {
databaseHelper.createDataBase();
} catch (IOException e) {
e.printStackTrace();
}
// Closing the Data base.
databaseHelper.close();
return null;
}
@Override
protected void onPostExecute(Void result) {
pauseSplashScreen(context);
}
}
public void pauseSplashScreen(final Context context) {
// New Thread call.
new Thread() {
// Running Thread.
public void run() {
int count = 0;
while (count < 5) {
try {
Thread.sleep(1000);
} catch (Throwable e) {
e.printStackTrace();
}
count++;
}
Intent intent = new Intent(context, Activity2.class);
startActivity(intent);
finish();
}
}.start();
}
}
公共类SplashScreenActivity扩展了AppCompatActivity{
专用静态最终整数播放服务解析请求=9000;
专用广播接收机注册广播接收机;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity\u启动屏幕);
mrRegistrationBroadcastReceiver=新的BroadcastReceiver(){
@凌驾
公共void onReceive(上下文、意图){
SharedReferences SharedReferences=PreferenceManager.GetDefaultSharedReferences(上下文);
boolean sentToken=SharedReferences.getBoolean(QuickstartPreferences.SENT_TOKEN_到_服务器,false);
如果(sentToken){
//TODO令牌已发送到服务器
}否则{
//TODO显示令牌未发送到服务器的错误
}
}
};
如果(checkPlayServices()){
//启动IntentService以向GCM注册此应用程序。
意向意向=新意向(此,RegistrationEntService.class);
startService(意向);
}
初始化屏幕();
}
私有布尔值checkPlayServices(){
GoogleAppAvailability apiAvailability=GoogleAppAvailability.getInstance();
int-resultCode=apiAvailability.isGooglePlayServicesAvailable(此);
if(resultCode!=ConnectionResult.SUCCESS){
if(apiAvailability.isUserResolvableError(resultCode)){
apiAvailability.getErrorDialog(此、结果代码、播放服务、解析请求)。show();
}否则{
Log.i(“启动屏幕活动”,“不支持此设备”);
完成();
}
返回false;
}
返回true;
}
@凌驾
受保护的void onPause(){
LocalBroadcastManager.getInstance(this).unregisterReceiver(mrRegistrationBroadcastReceiver);
super.onPause();
}
@凌驾
受保护的void onResume(){
super.onResume();
LocalBroadcastManager.getInstance(this.registerReceiver)(mrRegistrationBroadcastReceiver,新的IntentFilter(QuickstartPreferences.REGISTRATION_COMPLETE));
}
私有void InitializeScreen(){
新建LoadDataBase(SplashScreenActivity.this).execute(SplashScreenActivity.this);
}
私有类LoadDataBase扩展异步任务{
语境;
公共加载数据库(上下文){
this.context=上下文;
}
@凌驾
受保护的void onPreExecute(){
super.onPreExecute();
}
@凌驾
受保护的Void doInBackground(上下文…arg0){
//从资产文件夹创建数据库。
DatabaseHelper DatabaseHelper=新的DatabaseHelper(arg0[0]);
试一试{
databaseHelper.createDataBase();
}捕获(IOE异常){
e、 printStackTrace();
}
//关闭数据库。
databaseHelper.close();
返回null;
}
@凌驾
受保护的void onPostExecute(void结果){
暂停屏幕(上下文);
}
}
公共void pauseSplashScreen(最终上下文){
//新线程调用。
新线程(){
//运行线程。
公开募捐{
整数计数=0;
同时(计数<5){
试一试{
睡眠(1000);
}捕获(可丢弃的e){
e、 printStackTrace();
}
计数++;
}
意向意向=新意向(上下文,Activity2.class);
星触觉(意向);
完成();
}
}.start();
}
}
问题是:在启动屏幕之前,我在应用程序启动时会出现白色屏幕,这可能是因为上面链接中给出了推送通知注册
我该怎么做才能避免出现白色屏幕。请指导我。您正在使用私有内部类创建数据库。从那里你可以调用pauseSplashScreen(上下文)。然后开始一个新的线程?为什么? 我建议给异步任务它自己的类一个接口,以便向调用活动返回信号 如果你使用
Intent intent = new Intent(context, Activity2.class);
startActivity(intent);
您不必调用finish(),该调用最好用于完成当前活动并返回上一个活动。(我让你使用一个线程来阻止其余应用程序的运行,让该线程返回给你,然后转到下一个活动不是更好吗?)
因此,为了回答您的问题,我猜启动活动需要一些时间,您看到的是加载的blanc布局。这只是因为您使用的是调试版本,当您更改为发布版本时,它将消失。不要对此感到奇怪 我删除了整个数据库创建代码并暂停了Flash屏幕。只保留推送通知注册码,那么同样的事情也会发生……这可能是问题所在吗?否则:是否使用调试器?或者将推送通知注册码移动到onResume()?