我一直在玩各州试图找出原因,当我按下电源按钮调出锁定屏幕时,我的应用程序失去焦点并调用它的onStop()(应该如此)但是它调用onStart( )再次在屏幕熄灭之前.这导致我出现问题,因为我的应用程序中的某些声音(可能是其他东西)在锁定屏幕处于活动状态时再次开始播放.
当锁屏活动时,如何确保它正确地背景和停止?
我有一个在单独进程中运行的服务.我发现在主进程UI线程退出onDestroy()之后我的服务正在被销毁,即使我已经提供了带有绑定的应用程序上下文并指定了BIND_AUTO_CREATE.
在我的主进程'UI thread onCreate()中,我有这个绑定代码:
Intent intent = new Intent(mAppContext, MyService.class);
mAppContext.bindService(intent, mMyServiceConnection, Context.BIND_AUTO_CREATE);
Run Code Online (Sandbox Code Playgroud)
在我的主进程'UI thread onDestroy()中,我有这个无法解释的代码:
mAppContext.unbindService(mMyServiceConnection);
Run Code Online (Sandbox Code Playgroud)
请注意,我从不调用stopService().
Android的bindService()文档说:
只要存在调用上下文,系统就会认为该服务是必需的.
如果我正确地阅读,因为我提供了应用程序的上下文,系统认为该服务在应用程序的生命周期内是必需的.
我原以为应用程序的上下文可能会与onDestroy()一起消失.这就是Android的文档对getApplicationContext()的说法:
返回当前进程的单个全局Application对象的上下文.
如果应用程序的上下文与onDestroy()一起消失,那么我认为Android有一个大问题.问题是当旋转显示时,调用onDestroy()(紧接着是onCreate()).因此效果是当显示器旋转时 - 在我的情况下它经常发生! - 我的服务总是退出.
请注意,我的应用程序进程的pid永远不会更改,即它是相同的进程.鉴于getApplicationContext()的文档声明"当前进程",这一点很重要.
以下是我的调试日志显示的内容:
04-03 05:15:12.874:DEBUG/MyApp(841):main onDestroy
04-03 05:15:12.895:DEBUG/MyApp(847):service onUnbind
04-03 05:15:12.895:DEBUG/MyApp(847) ):service onDestroy
04-03 05:15:12.934:DEBUG/MyApp(841):main onCreate
04-03 05:15:12.966:DEBUG/MyApp(847):service onCreate
04-03 05:15:12.975:DEBUG/MyApp(847):service onBind
所以我的问题是:
1)我对绑定/解除绑定的理解是否正确?
2)当调用UI线程的onDestroy()时,有没有办法让我的服务不被破坏?
问题#2的黑客攻击永远不会解开.但是我不喜欢它,因为每次调用onDestroy()时我都会泄漏一个绑定.我可以"记住"我有一个泄漏的绑定,只泄漏那个,但后来我有级联黑客,它真的很难看.
可能的重复:
Activity 在轮换 Android 上重新启动
我有一个 LinearLayout,我想android:orientation="vertical"在纵向模式和android:orientation="horizontal"横向模式下都使用它。Activity 执行一些复杂的操作,因此允许 Activity 在方向更改时关闭并重新启动本身不是一种选择,因此排除使用 layout-land 功能或任何其他涉及重新启动 Activity 的方法。我目前正在以编程方式设置正确android:orientation的活动onStart和onConfigurationChanged.
不幸的是,当你旋转屏幕时,只有大约 20% 的时间它实际上改变了布局。我一直无法理解一种模式 - 它似乎有时会这样做,而有时则不会。我尝试.invalidate()在执行更改后调用LinearLayout,但这似乎不起作用。如何强制视图以新方向重绘,或者有更好的方法来实现这一点?
基本上,这里有问题的代码有时有效,但不是其他:
@Override
public void onConfigurationChanged(Configuration newConfig) {
((LinearLayout)contentView.findViewById(R.id.someLinearLayout))
.setOrientation(newConfig.orientation==Configuration.ORIENTATION_PORTRAIT ?
LinearLayout.VERTICAL
: LinearLayout.HORIZONTAL);
}
Run Code Online (Sandbox Code Playgroud) 您好我正在尝试实现登录屏幕,显示进度对话框并允许手机旋转.
我想问一下最好的方法是什么(IntentService,AsyncTask,Service)并允许手机旋转?
我读了很多答案,说使用AsyncTask等空片段的不同内容.
我有以下问题.启动后,即使在更改屏幕方向后,应用程序也能正常工作.应用程序尚未准备好处理方向更改(例如,替代布局等),因此只显示旋转的默认布局并且没有问题.但是,当我通过按后退键离开应用程序时,更改方向并在再次启动应用程序后立即崩溃.崩溃后,如果我再次启动应用程序,它会很好地工作,直到前面描述的情况发生 - 然后它崩溃.
我已将设备连接到计算机并以调试模式运行应用程序.重新启动后,甚至在调用onCreate之前抛出异常.崩溃调用堆栈如下:
Thread [<1> main] (Suspended (exception IllegalArgumentException))
WindowManagerImpl.removeViewImmediate(View) line: 262
Window$LocalWindowManager.removeViewImmediate(View) line: 436
ActivityThread.handleDestroyActivity(IBinder, boolean, int, boolean) line: 4022
ActivityThread.handleRelaunchActivity(ActivityThread$ActivityRecord, int) line: 4127
ActivityThread.access$2400(ActivityThread, ActivityThread$ActivityRecord, int) line: 136
ActivityThread$H.handleMessage(Message) line: 2183
ActivityThread$H(Handler).dispatchMessage(Message) line: 99
Looper.loop() line: 143
ActivityThread.main(String[]) line: 5068
Method.invokeNative(Object, Object[], Class, Class[], Class, int, boolean) line: not available [native method]
Method.invoke(Object, Object...) line: 521
ZygoteInit$MethodAndArgsCaller.run() line: 858
ZygoteInit.main(String[]) line: 616
NativeStart.main(String[]) line: not available [native method]
Run Code Online (Sandbox Code Playgroud)
我计划稍后处理屏幕旋转,但在此之前,我希望默认行为正常工作.
我只覆盖了onCreate Activity的方法.我还有自定义应用程序类,它创建了一个应用程序范围的使用引擎类的实例:
public class ProCalcApplication extends Application
{ …Run Code Online (Sandbox Code Playgroud) 您好,我面临 Android Webview 方向问题,当更改方向时,应用程序重新启动并从头开始显示页面。我正在阅读不同的答案,但没有解决方案对我有用,这就是为什么我在这里给出我的代码。请任何 Android 开发人员帮助我并告诉我在哪里编辑代码或添加一些东西
package com.example.edarabia;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.graphics.Bitmap;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.Bundle;
import android.view.KeyEvent;
import android.webkit.WebView;
import android.webkit.WebViewClient;
@SuppressLint("SetJavaScriptEnabled")
public class MainActivity extends Activity{
WebView mywebview;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if(isNetworkConnected() == true){
setContentView(R.layout.activity_main);
mywebview = (WebView) findViewById(R.id.webview);
mywebview.getSettings().setJavaScriptEnabled(true);
mywebview.setWebViewClient(new myWebClient());
mywebview.loadUrl("http://www.grafdom.com/operations/projects/ma/edarabiaapp/");
mywebview.getSettings().setBuiltInZoomControls(true);
mywebview.getSettings().setLoadWithOverviewMode(false);
mywebview.getSettings().setUseWideViewPort(false);
}else{
setContentView(R.layout.splash);
showBuyDialog();
}
}
// @Override
// public boolean onKeyDown(int keyCode, KeyEvent event) {
// Check if …Run Code Online (Sandbox Code Playgroud) 现在,如果用户碰巧从纵向模式切换到横向模式,则活动将获得onDestroy调用.此时我关闭套接字并停止线程.
当Android切换横向模式时,它再次调用onCreate,我必须重新连接套接字.此外,所接收的活动的所有数据都需要再次下载,因为服务器无法知道之前发送的内容,即没有"恢复"功能.
因此问题在于,当横向模式改变时,存在大量重新发送的数据.
我有什么选择?
欢迎所有输入:-)
/亨利克
我有一个画布,当方向改变时它会被重绘.这是一个不是Android提供的自定义画布.
更改屏幕布局时,应用程序状态和(所有视图的状态)都会重置.我只将屏幕方向改为肖像; 它保持屏幕布局不变,但应用程序再次重置.
我检查了文档,发现当方向发生变化时,活动被破坏并重新启动.Savestate()无法保存和加载我的自定义画布所需的位图数据或任何大数据.
我再次检查了文档,并找到了处理运行时更改主题,其中提到了onConfigurationChanged(),在发生特定配置更改时会调用它,在我的情况下是'orientation'.此方法可防止重新启动,并使开发人员如何实现配置更改.它甚至在最后一段中提到,如果我不实现该方法,那么这只会导致活动跳过onRestart()并且什么都不做.我将清单文件设置为
android:screenOrientation="portrait"
android:configChanges="orientation"
Run Code Online (Sandbox Code Playgroud)
我没有实现onConfigurationChanged().但这也无济于事.我不知道为什么.这对我来说似乎很有帮助.
如果您有任何问题,请发布解决方案 此外,应用程序需要一些合理的时间,我希望应用程序不会在方向更改时重新启动.实际上,当发生这种情况时,我不想做任何事情.我也在使用模拟器,所以请澄清它是否只是模拟器问题.
PS我的互联网连接已关闭,我正在使用我的愚蠢移动客户端.我检查了离线文档.请耐心等待拼写.我想找到解决办法,但目前我很难过.
我目前有一个类播放音频文件,但如果我将屏幕倾斜到水平或纵向,它只是重新启动.在倾斜屏幕后,如何让我的应用继续从停止的位置开始?请注意,我不希望我的应用程序被固定在纵向/水平位置.
Public void Play(){
AudioRenderer mr = new AudioRenderer();
mp = mr.AudioRenderer(filePath);
}
private class AudioRenderer extends Activity {
private MediaPlayer AudioRenderer(String filePath) {
File location = new File(filePath);
Uri path = Uri.fromFile(location);
mp= MediaPlayer.create(this, path);
}
return mp}
Run Code Online (Sandbox Code Playgroud)
非常感谢!!
我的应用程序是一个简单的表单 我使用TableLayout,并设置了很多行visibility="gone".当用户开始填写表单时,越来越多的行变得可见.但问题是,第二个屏幕从纵向旋转到横向,或从横向旋转到纵向,整个表单重置,所有可见的字段都变得不可见.有没有办法防止这种情况发生?
在此先感谢帮助的人:)
我是android体系结构组件的新手,我对它一点也不困惑viewmodel。我正在构建一个从服务器获取项目列表并在布局中显示为列表的应用程序。我已经在Repository课堂上实现了网络通话。
Repository.java:
//Get list of top rated movies
public LiveData<NetworkResponse> getTopRatedMovies() {
final MutableLiveData<NetworkResponse> result = new MutableLiveData<>();
ApiService api = retrofit.create(ApiService.class);
Call<MovieData> call = api.getTopRateMovies("api_key");
call.enqueue(new Callback<MovieData>() {
@Override
public void onResponse(Call<MovieData> call, Response<MovieData> response) {
result.postValue(new NetworkResponse(response.body()));
}
@Override
public void onFailure(Call<MovieData> call, Throwable t) {
Log.e(TAG, t.getLocalizedMessage());
result.postValue(new NetworkResponse(t));
}
});
return result;
}
Run Code Online (Sandbox Code Playgroud)
现在在ViewModel课堂上我正在这样做:
public class MovieListViewModel extends ViewModel {
public LiveData<NetworkResponse> result, topRatedMovies;
public LiveData<List<MovieEntity>> favoriteMovies;
private Repository repository; …Run Code Online (Sandbox Code Playgroud) android android-livedata android-viewmodel android-architecture-components android-jetpack
我的活动正在接近轮换.不知道为什么?
此外,我检查了这个问题: 在Android上旋转活动重启 但无法找到解决方案.
这是我的oncreate函数:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.manage);
//Defining and Getting Saved Preferences
data=getSharedPreferences("cybapps", 0);
dataeditor=data.edit();
//To Delete all Preferences
dataeditor.clear();
dataeditor.commit();
//Declaration
btn_delete=(Button)findViewById(R.id.btn_delete);
btn_schedule=(Button)findViewById(R.id.btn_schedule);
btn_deschedule=(Button)findViewById(R.id.btn_deschedule);
profilelist=(ListView)findViewById(R.id.profilelist);
am=(AudioManager)getSystemService(Context.AUDIO_SERVICE);
status=(TextView)findViewById(R.id.status);
random=new Random();
btn_delete.setOnClickListener(this);
btn_schedule.setOnClickListener(this);
btn_deschedule.setOnClickListener(this);
//Listout all profiles
listout();
}
Run Code Online (Sandbox Code Playgroud)